LAT 翻译器调试与问题定位说明(草稿版) #192
LaurenIsACoder
started this conversation in
Show and tell
Replies: 1 comment 2 replies
-
|
RFR: https://github.com/xiangzhai/lat/wiki/find_ld_part-and-find_ld_bridge |
Beta Was this translation helpful? Give feedback.
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
本文用于指导在 LAT二进制翻译器使用过程中,系统性地定位功能异常、兼容性等问题。重点说明如何通过 版本回退对比、LAT-TCG / QEMU-TCG 对比验证、TSO 设置、 PAGESIZE 变更、运行时环境对齐等手段,区分问题来源是:
我们希望,您阅读完本文之后可以:
1、LAT 调试的基本原则
在定位问题时,应遵循以下基本原则:
2、LAT 问题排查的基本步骤
在调试 LAT 过程中,不必严格按照下面这个顺序来,如果没有更多的调试思路,也许可以试试下面的建议:
2.1 更换不同翻译器版本进行尝试
虽然上述原则中首先写明了应当 先排除环境问题,再排查翻译器问题,但由于更换翻译器几乎不会浪费什么时间,所以也可以先换上不同 tag 对应的翻译器,来看看该问题是:
2.1.1 如何更换翻译器
可以选择将 /usr/bin/ 目录下的翻译器直接替换掉,但这么做也许会带来包管理器的一些风险。
也可以临时更改系统中 binfmt 的路径到你调试版本的路径。
2.1.2 确认为回归问题后如何继续定位
对确认是新引入的问题,建议通过 Git 二分法:
持续编译、测试,最终精确定位到具体引入该问题的提交。
2.2 LAT 环境变量调整
可通过调整如下环境变量观察程序行为是否有变化。
2.3 排除环境问题
对于大型闭源应用程序,可以通过 LAT 翻译器运行 Guest 架构的 Docker 环境,试着先在 Docker 中将程序运行起来,在这个过程中可以确定该程序依赖什么库,并检查对应的库文件是否在 /usr/gnemul 中的 Guest 运行时中。
2.4 对于 .NET、JAVA 等类型的 Guest 程序需开启 TSO 模式
具体方法详见本 LAT opensource 中的 memory-model-config 。
2.5 尝试更换 4K 页内核进行测试
尤其是对于某些 SIGSEGV 类型的错误,可以尝试更换 4K 页内核进行测试。
比如 SIGSEGV 的 si_code 为 2,并且 siaddr 所对应的地址在 guest 中本来有对应的权限,那么这也许是 LAT 中兼容 4K 16K 页大小机制的 ”影子页“ 机制引入的问题。
2.6 对比 LAT-TCG、QEMU-TCG
通过对比 LAT-TCG,可以看是否为指令翻译错误。
目前 LAT 并没有确保 backport 每一个 QEMU 上游的 linux-user 补丁,所以也可以与 QEMU-TCG对比测试,看是否可以通过 backport 某个上游补丁来解决问题。
2.7 对比新旧世界现象
对于 ABI1.0(江湖上所说的旧世界)与 ABI2.0(新世界),LAT 在某些代码中用 CONFIG_LOONGARCH_NEW_WORLD 包裹了不同的实现,因此也可以试着换到另外一个 ABI 的系统上,看是不是这部分差异实现的代码导致的问题。
3、LAT 的一些调试思路
如果上述实验都不能正确运行所调试的程序, 就要开启真正的调试之路了。
3.1 关闭更多优化
除了上面所述的 AOT 和库直通,LAT 还有一些其它优化可以关闭,optimize-config.h 中有一些常见优化的编译开关,比如可以通过注释掉下面两行代码来关闭 flag reduction 优化
3.2 SIGSEGV 等有明显异常退出原因的问题
对于这类问题,可以通过分析信号上下文的一些信息来进行调试,LAT 与 QEMU 一样,信号的第一入口都是 host_signal_hander 函数,可以试着从这里开始进行你的分析之路。
3.3 strace
可通过抓取翻译运行的 strace 日志,并与在原生架构下运行的 strace 日志进行对比,看是否有明显的错误。
Beta Was this translation helpful? Give feedback.
All reactions