由于 qemu 用户模式模拟不支持
ptrace
系统调用,我尝试通过 qemu 的 gdbstub 调试 qemu 用户模式模拟进程,并使用另一个 gdb 实例通过 target remote :1234
连接到它。
这对于一些基本命令(如
si
)到单步指令来说效果很好,但我无法在主模拟可执行文件中的符号上设置断点(如 main
)。只需运行 break main
就会说断点设置为某个原始的未重定位地址(例如 0x63a,但如果我在 gdb 客户端中点击 c
,则主可执行文件的符号永远不会解析为真实的虚拟地址,然后永远不会被击中。
这是调试 qemu 用户模式模拟进程的常见问题吗?有什么方法可以正确设置断点吗?
如果您在真实目标上调试本地应用程序或远程应用程序,GDB 似乎足够聪明,可以应用重定位偏移量。然而对于 QEMU 来说,情况似乎并非如此。
我的工作如下:
服务器:
qemu-aarch64 -g 1234 -L <my sysroot> <my executable>
GDB-客户端:
gdb-multiarch -ex "target remote :1234" -ex "set sysroot <my sysroot>" -ex "file <my executable> -o 0x4000000000"
并且
0x4000000000
是我的服务器上运行的所有可执行文件的重定位偏移量。
帮助我找到此解决方案的一个问题是:QEMU“-bios”与“-kernel”与“-device loader,file=...”