You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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调试流程

  1. GDB连接后,先在start_kernel设断点,执行c触发断点
  2. 在start_kernel断点处,额外设置一个内核启动后期的断点(比如rest_init),再执行c
  3. 当虚拟机进入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 04:57:03