如何调试QEMU加载内核中运行的自定义系统调用测试程序?
调试用户态系统调用测试程序的方法
1. 同时关联内核与用户态符号调试
- 启动QEMU时,除了用
-s -S开启远程调试端口,必须加上-append "nokaslr"关闭内核地址随机化,避免用户态程序实际运行地址和编译地址偏差。 - 先通过
target remote localhost:1234连接内核调试,在GDB里执行set architecture i386:x86-64(根据实际架构调整),再加载用户态程序符号:add-symbol-file /path/to/your/test-program 0x<程序加载基地址>。基地址可以在测试程序里加一行打印:printf("Base addr: %p\n", &_start);,静态编译的程序里这个地址就是实际加载起始地址。
2. 手动插入硬件断点
- 在测试系统调用的代码前直接插
asm("int $3");,程序运行到这里会触发断点,不管地址随机化或KPTI是否开启。启动QEMU后,GDB连接后会自动停在这个位置,之后就能单步跟踪系统调用流程。
3. 临时关闭KPTI验证(仅测试用)
- 要是确定KPTI是干扰因素,启动QEMU时内核参数加
pti=off,也就是-append "nokaslr pti=off",同时用-no-pie编译测试程序,此时程序运行地址和编译时的静态地址完全一致,直接在GDB里敲b main或者b 你的系统调用测试函数名就能精准命中断点。
4. 绑定根文件系统加载符号
- 启动QEMU时用
-gdb tcp::1234 -S,先在GDB里加载测试程序符号:file /path/to/your/test-program,再连接远程调试:target remote localhost:1234。如果是静态编译程序,还可以加set sysroot /path/to/your/rootfs指定根文件系统,确保符号加载无偏差。
内容的提问来源于stack exchange,提问作者Nemo
相关产品推荐
相关产品推荐

