Debug Linux kernel using KGDB
>>>>>>>>文章来源 http://www.cnblogs.com/justingreen<<<<<<<<
软件环境:VMware 7.1;CRUX-2.6;gdb-7.0a
内核编译及KGDB安装详见 http://www.cnblogs.com/justingreen/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
>>>>>>>>文章来源 http://www.cnblogs.com/justingreen<<<<<<<<
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。