GDB在start_kernel断点续行后挂起,如何继续调试Linux内核?
解决GDB续行后挂起的问题
检查Qemu启动参数
确保Qemu启动时保留持续调试能力,而非仅启动阶段生效。推荐使用以下参数组合:
-s: 等价于-gdb tcp::1234,固定监听1234端口供GDB连接-S: 启动虚拟机后立即暂停,等待GDB连接- 内核参数加上
nokaslr,关闭地址空间随机化,避免断点位置错位
示例启动命令:
qemu-system-x86_64 -kernel ./arch/x86/boot/bzImage -initrd ./rootfs.cpio.gz -s -S -append "console=ttyS0 nokaslr"
调整GDB调试流程
- GDB连接后,先在
start_kernel设断点,执行c触发断点 - 在
start_kernel断点处,额外设置一个内核启动后期的断点(比如rest_init),再执行c - 当虚拟机进入shell后,GDB默认不会自动暂停,此时可手动在目标内核函数(如
sys_open、sys_execve)设置断点,用户态程序触发系统调用时,GDB会自动捕获断点
确认内核编译调试选项
编译内核时必须开启以下关键选项:
CONFIG_DEBUG_INFO=y: 生成完整调试信息,确保GDB能解析内核符号CONFIG_GDB_SCRIPTS=y: 启用内核GDB脚本支持,简化调试操作CONFIG_KALLSYMS=y: 导出内核全局符号,让GDB识别函数名
可通过make menuconfig图形化开启,或直接修改.config文件添加对应配置
临时恢复挂起的GDB
如果GDB已经挂起,不要直接关闭:
- 按下
Ctrl+C尝试中断等待状态 - 执行
set scheduler-locking on,锁定调试上下文到内核线程,避免用户态线程干扰 - 重新设置内核态函数断点后执行
c,等待shell执行命令触发断点
内容的提问来源于stack exchange,提问作者evstack
相关产品推荐
相关产品推荐

