参考文献
http://blog.youkuaiyun.com/majieyue/article/details/6967770
http://blog.youkuaiyun.com/majieyue/article/details/6970883
http://www.cnitblog.com/schkui/archive/2006/11/01/18735.html
http://kgdb.geeksofpune.in/credits.htm
需要两台机器,开发机和目标机;开发机搭建调试环境,目标机是最终发布的产品。如下步骤
1.配置端口
确定机器所用的com号;可用dmesg | grep serial 或 图形界面查看;一下以开发机使用串口1(/dev/ttyS0),目标机使用串口2(
/dev/ttyS1)
为例;
开发机:stty -F /dev/ttyS0 ispeed 115200 ospeed 115200
目标机:stty -F /dev/ttyS1 ispeed 115200 ospeed 115200
用命令
stty -F /dev/ttyS0 测试配置是否成功;
测试是否连通;1)
开发机:cat /dev/ttyS0
2)目标机:echo "111 222 333" > /dev/ttyS1
3)如果开发机收到,说明目标机到开发机是连通的
同样方法测试开发机到目标机是否连通
2.目标机编译内核
3.开始调试
照1设置目标机和开发机的端口
目标机:echo ttyS1>/sys/module/kgdboc/parameters/kgdboc
目标机:echo ttyS1>/sys/module/kgdboc/parameters/kgdboc
目标机:加载内核模块;查看内核模块的符号表;以tmp.ko为例
install tmp.ko
cat /sys/module/tmp/sections/.txt
cat /sys/module/tmp/sections/.bss
cat /sys/module/tmp/sections/.rodata*
开发机: 将目标机新编译的内核copy到开发机中;到目标机内核所在的目录下,加载内核,设置远程端口,加载模块符号表;依次输入
gdb vmlinux
set remotebaud 115200
target remote /dev/ttyS0
目标机:echo g >/proc/
sysrq-trigger
开发机: 查看线程;切换线程;加载模块符号表(目标机上insmod 完 tmp.ko之后,要去查看/sys/module/tmp/sections里面的 .text .data .bss 等地址,这些地址都是 0x 开头的32bit 或者 64bit 的16进制数);
info threads
thread 66
add-symbol-file hellop.ko $TEXT_SEGMENT_ADDR -s .data $DATA_SEGMENT_ADDR -s .bss $BSS_SEGMENT_ADDR查看帧;之后就可以看一些局部变量
thread 66
bt
frmame 2
4.其他
4.1 生成gdb所需符号表加载命令的脚本
#!/bin/bash
# usage: gdbline.sh module_name module_path
# This script will outputs an add-symbol-file line suitable for pasting into gdb to examine
# a loaded module.
cd /sys/module/$1/sections
echo -n add-symbol-file $2 `/bin/cat .text`
for section in .[a-z]* *; do
if [ $section != ".text" ]; then
echo " \\"
echo -n " -s" $section `/bin/cat $section`
fi
done
echo