实验环境:
硬件环境:两台物理机,并使用串口连接
操作系统: CentOS-6.3-x86,CentOS是RedHat的一个社区版本
调试内核:linux-2.6.32 (自从linux kernel 2.6.26已经集成kgdb,kgdb再不需要单独下载)
实验原理:
实验步骤:
编译安装内核
在开发机上编译内核并将其安装在目标机。内核的编译和安装方法在此不再赘述,请参考相关资料。
验证串口
Target端输入:
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
cat /dev/ttyS0
Development端输入:
stty ispeed 115200 ospeed 115200 -F /dev/ttyS0
echo "hello" >/dev/ttyS0
串口添加完成后会在 Target端输出“hello”,这说明说明串口通讯正常。
模块调试
Target端:
1,加载待调试模块:insmod module.ko
2,查询模块加载地址:cat /sys/module/module/sections/.text
运行该命令后,会返回一个16进制的地址,这是module模块的.text段地址。如:
0xffffffffa00b3000(把这个地址记下来,以备后用)
3,echo g > /proc/sysrq-trigger
系统会中断,进入假死状态,等待远程gdb的连接。
Development端:
1, 进入Linux源码目录,可以看到目录下生成了vmlinux文件,这个就是没有经过压缩的linux内核文件。执行如下操作:
gdb ./vmlinux
2,设置调试参数:
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0
出现如下显示表示连接成功。
Remote debugging using /dev/ttyS0
kgdb_breakpoint (key=<value optimized out>, tty=<value optimized out>) at kernel/kgdb.c:1718
1718 wmb(); /* Sync point after breakpoint */
3, 加载符号文件:
(gdb) add-symbol-file /root/biangw/ldd/module/module.ko0xffffffffa00b3000
出现如下显示:
add symbol table from file "/root/biangw/ldd/module/module.ko" at
.text_addr = 0xffffffffa00b3000
(y or n) y
Reading symbols from /root/biangw/ldd/module/module.ko...done.
4, 设置断点
(gdb) b module_end
Breakpoint 1 at 0xffffffffa0064009: file /root/biangw/ldd/module/module.c, line 29.
然后
(gdb) cont
Continuing.
此时,就可以到target端,进行其他操作。若触发断点,development端就会停下来,从而可以方便查看变量等信息。
参考资料
1, 在VMware环境下使用KGDB调试Linux内核及内核模块
2, GDB内核调试.ppt