从Linux 2.6.25起, KGDB被集成到Linux内核中,这使得kgdb的使用变得简单和轻松。
运行如下命令启动配置内核脚本。
1 KGDB必须使能的内核选项:
1
2
3
4
| CONFIG_EXPERIMENTAL = y
Location:
-> General setup
-> Prompt for development and/or incomplete code/drivers |
1
2
3
4
| CONFIG_KGDB = y
Location:
-> Kernel hacking
-> KGDB: kernel debugger |
1
2
3
4
5
| CONFIG_KGDB_SERIAL_CONSOLE = y (使用串口进行通信)
Location:
-> Kernel hacking
-> KGDB: kernel debugger
-> KGDB: use kgdb over the serial console |
2 其它相关内核选项:
2.1 建议关闭的选项
1
2
3
4
5
6
| CONFIG_DEBUG_RODATA = n
该选项是将内核的一些内存区域空间设置为只读,这样可能导致kgdb的
设置软断点功能失效。所以推荐将该选项关闭。
Location:
-> Kernel hacking |
2.2.2 建议打开的选项
1
2
3
4
5
6
7
| CONFIG_KGDB_LOW_LEVEL_TRAP = y
使能该选项可以kgdb不依赖notifier_call_chain()机制来获取断点异常,
这样就可以对notifier_call_chain()机制实现相关的函数进行单步调试。
Depends on: KGDB [=y] && (X86 [=y] || MIPS [=MIPS])
Location:
-> Kernel hacking
-> KGDB: kernel debugger (KGDB [=y]) |
关于KGDB_LOW_LEVEL_TRAP的缘由详情,可参考这里。
1
2
3
4
| CONFIG_DEBUG_INFO = y
该选项可以使得编译的内核包含一些调试信息,使得调试更容易。
Location:
-> Kernel hacking |
1
2
3
4
| CONFIG_FRAME_POINTER = y
该选项将使得内核使用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯,即函数调用栈信息。
Location:
-> Kernel hacking |
1
2
3
4
5
| CONFIG_MAGIC_SYSRQ = y (如果你选择了KGDB_SERIAL_CONSOLE,这个选项将自动被选上)
激活"魔术 SysRq"键. 该选项对kgdboc调试非常有用,kgdb向其注册了‘g’魔术键来激活kgdb 。
Location:
-> Kernel hacking |
当你想手动激活kgdb时,你可以触发SysRq的g键, 如:
1
| $ echo "g" > /proc/sysrq-trigger |
[…] 一般软件调试的原理是,调试器根据目标文件的调试信息找到源码和机器码之间的映射 关系,并把它关心的指令替换成一条断点指令,x86 对应的就是 asm(“int $3″),它的二进制代 码是 0xcc.当程序执行到这个地方时断点指令被执行,程序被中断,调试器接管它的控制权, 这时可以查看内存信息甚至修改内存.当调试器完成任务后把断点指令替换回原来的指令, 并把 pc 寄存器减一,让 cpu 从被中断的那条指令开始执行.这样程序可以在没有影响执行的 情况下被调试. 调试内核也离不开一般原理,只不过内核不同一般程序,不能单靠同一台机的 gdb 来完成. 要依靠 kgdb,它是内核里面的一小段程序,它可以和另外一台机器上的 gdb 进行通信,可以执行 gdb 过来的一些命令并返回信息,完成调试过程. 关于kgdb的配置,网上有很多,而且非常详细,这里就不重复了. […]
[…] 需确保如下选项被选中(参考kgdb内核选项配置) ?View Code BASH General setup —> [ * ] Prompt for development and/or incomplete code/drivers Kernel hacking —> [ * ] Compile the kernel with debug info [ * ] Compile the kernel with frame pointers [ * ] KGDB: kernel debugger —> < * > KGDB: use kgdb over the serial console […]