kgdb在内核2.6.26中加入,用于调试内核。kdb是内建的内核调试器,由SGI开发。 网络
二者差别是:数据结构
这里两台机器(使用的是两台VBox的虚拟机),一个是目标机器(被调试内核的机器),另外一台是开发机器(链接被调试内核的机器)。frontend
要使用kgdb,须要从新编译下内核,先修改相关配置:spa
[*] Compile the kernel with debug infodebug
[*] KGDB: kernel debugger ---> 调试
[*] KGDB_KDB: include kdb frontend for kgdb 开发
CONFIG_DEBUG_INFO选项使得编译中生产调试信息。虚拟机
CONFIG_STRICT_KERNEL_RWX选项会阻止内核的某些断点,因此禁止(4.15.15中并未看到此项)。并增长KDB。最后查看.config配置文件包含以下:it
CONFIG_FRAME_POINTER=y编译
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
CONFIG_KGDB_KDB=y
CONFIG_DEBUG_INFO=y
而后进行编译安装,make –j2 && make modules_install && make install
在内核启动参数中添加,表示启动,经过串口ttyS0来实现kgdb调试。
kgdbwait kgdboc=ttyS0,115200
kgdbwait能够让kgdb在内核启动阶段等待一个调试器连接进来,系统此刻是挂住的。
注:kgdboc表示kgdb over concole,是配置gdb和kgdb通讯的首选机制。
也能够运行过程当中使能或禁止命令,以下:
echo ttyS0 > /sys/module/kgdboc/parameters/kgdboc
echo "" > /sys/module/kgdboc/parameters/kgdboc
使能kgdb后要禁止内核执行,执行以下,触发一个中断:
echo g > /proc/sysrq-trigger
目标机器挂住后,就是开发机器连接到目标机器上去了。下面来看下整个过程。