用kgdb 调试模块-第三部分:动态启动kgdb

只有有限的几句,才是核心的内容,前面的准备及大部分的叙述都是铺垫。

需要我们经常操作的,就那么几句!!!

-------------------------------------------------

动态启动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);
--


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值