Debug Linux kernel using KGDB

  软件环境:VMware 7.1;CRUX-2.6;gdb-7.0a

  内核编译及KGDB安装详见 http://www.cnblogs.com/awarrior/p/3343310.html

 

  1. 预备

  本文默认内核已安装了KGDB。如果系统没有gdb工具,先去下载一个最新版本的gdb:https://www.gnu.org/software/gdb/

  本文使用的是安装包gdb-7.0a.tar.gz(使用7.1以上版本会有qTStatus返回22错误,具体见参考文献),解压后进入目录编译安装:

./configure
make
make install

  安装后有gdb和gdbserver两个工具,可以将其加入环境变量中。

  将当前系统镜像命名为CRUX1(服务端),拷贝一份命名为CRUX2(客户端)用于调试。

  在两个虚拟机的设置各添加一个串口,连接使用同一命名管道(\\.\pipe\com_1),注意服务器和客户端的对应。

  2. 内核调试

  第一种情况:启动CRUX1,进入CRUX-KGDB。这时启动状态会停留在这里:

kgdb: Waiting for connection from remote gdb 

  再启动CRUX2,进入CRUX。然后执行:

cd /usr/src/linux  
gdb vmlinux 

(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS1

  如果没有看到错误信息,则说明已经连接成功,但CRUX1上依然是假死状态。这时你可以像使用本地gdb一样设置断点(break),单步执行(step),或执行其它命令。

  如果要让CRUX1进入系统,则可以在CRUX2上输入:

(gdb) cont

  这时CRUX2会假死。

  如果要让CRUX2从GDB退出,可以输入quit。这时CRUX1也会终止等待。

  第二种情况:CRUX1进入系统后,若需要进入调试等待,可以输入:

echo g > /proc/sysrq-trigger 

  再让CRUX2建立与CRUX1的gdb通信。

  通信建立后,就可以使用gdb进行调试,断点可设置为内核源码函数,如start_kernel、copy_process等,gdb的使用可参考[3]或man。

 

  参考文献:

[1] gdb7.1-bug http://www.kgdb.info/kgdb/understand_kgdb/kgdb_bug_diary/kgdb-bugs-gdb_7_1-detach/

[2] VMware环境下的KGDB调试 http://blog.csdn.net/jie12310/article/details/4564853

[3] 用 GDB 调试程序 http://docs.huihoo.com/gnu/linux/gdb.html

 

 

 

posted @ 2014-02-25 10:39  awarrior  阅读(358)  评论(0编辑  收藏  举报