只有有限的几句,才是核心的内容,前面的准备及大部分的叙述都是铺垫。
需要我们经常操作的,就那么几句!!!
-------------------------------------------------
动态启动kgdb:
-------------------------------------------------
echo ttyS1 > /sys/module/kgdboc/parameters/kgdboc
如果成功, 可以在/var/log/message里看到 kernel: kgdb: Registered I/O driver kgdboc
注册kgdboc 后, 以后用魔幻字母 "g" 控制呼出kgdb
echo "g" > /proc/sysrq-trigger
系统会中断,进入假死状态,等待远程gdb的连接.
直到远程GDB 连接后并发送continue命令后才退出假死状态。
----------------------------------------
模块调试:
调试模块时,需要告诉gdb 符号地址。
----------------------------------------
cat /sys/module/hello/sections里面的 .text .data .bss 得到相应地址。
(gdb) add-symbol-file hellop.ko $TEXT_SEGMENT_ADDR -s .data $DATA_SEGMENT_ADDR -s .bss $BSS_SEGMENT_ADDR,
-s .exit.text $EXIT_ADDR
这样gdb就可以基于这些地址找到模块的symbol了
一般只要.text 地址就可以调试函数断点了。
look 一下我的调试端gdb 初始命令
root@ubuntu:/home/hjj/software/uxfs_now/kern# cat gdb.cmd
target remote /dev/ttyS1
add-symbol-file uxfs.ko 0xe08e9000 -s .exit.text 0xe08ea4b8
b exit_uxfs_fs
b ux_fill_super
-------------------------------------------------
kgdb 抓虫日记:
gdb 7.1 与 kgdb 有小许不匹配,网上找的解决办法, 记录其大意。
-------------------------------------------------
1. 用gdb 连接远程target, 运行detack, 出现错误:
Bogus trace status reply from target: E22
2. 分析:
(gdb)set debug remote 1 (设置gdb远程调试模式查看与kgdb之间的通信内容)
(gdb) detach
Sending packet: $qTStatus#49...Ack
Packet received: E22
Bogus trace status reply from target: E22
(gdb)
翻看了下gdb对包的处理,对于大部分包来说,返回“E22”的错误信息是可以被接受的.
对于不识别或者不支持的命令,都是返回”"空包给gdb的,
所以kgdb也应当返回”"空包给gdb,这样问题就解决了
2. 解决办法
diff --git a/kernel/kgdb.c b/kernel/kgdb.c
@@ -1009,10 +1009,8 @@ static void gdb_cmd_query(struct kgdb_state *ks)
switch (remcom_in_buffer[1]) {
case 's':
case 'f':
- if (memcmp(remcom_in_buffer + 2, "ThreadInfo", 10)) {
- error_packet(remcom_out_buffer, -EINVAL);
+ if (memcmp(remcom_in_buffer + 2, "ThreadInfo", 10))
break;
- }
i = 0;
remcom_out_buffer[0] = 'm';
@@ -1053,10 +1051,9 @@ static void gdb_cmd_query(struct kgdb_state *ks)
pack_threadid(remcom_out_buffer + 2, thref);
break;
case 'T':
- if (memcmp(remcom_in_buffer + 1, "ThreadExtraInfo,", 16)) {
- error_packet(remcom_out_buffer, -EINVAL);
+ if (memcmp(remcom_in_buffer + 1, "ThreadExtraInfo,", 16))
break;
- }
+
ks->threadid = 0;
ptr = remcom_in_buffer + 17;
kgdb_hex2long(&ptr, &ks->threadid);
--