前面的博文里介绍过如果用串口进行远程kernel调试,但如何调试可加载的内核模块呢?
我们举例加以介绍:假设想调试目标主机上的pf.ko,先去目标主机获得以下东西:
- $ kldstat
-
Id Refs Address Size Name
-
1 2 0xffffffff80100000 b4afb8 kernel
-
2 1 0xffffffff80e22000 2b150 pf.ko
主要是获得目标主机的pf.ko模块的加载地址“0xffffffff80e22000”
然后再开发机上按-g方式编译模块,编译好之后,要用objdump查看,找到在内核模块中,文本段的偏移量
- [root@fb73_vm114 /usr/src/sys/modules/pf]# objdump --section-headers ./pf.ko | grep text
-
0 .text 0002776f 0000000000000000 0000000000000000 00000040 2**4
取16进制模式的第4个数据,这里是00000040,和前面的地址“0xffffffff80e22000”加一起获得一个值“0xFFFFFFFF80E22040”,这个值就是内核模块文本段在内核中的加载地址。
这时把内核模块的符号加入gdb
- (kgdb) add-symbol-file /usr/src/sys/modules/pf/pf.ko 0xFFFFFFFF80E22040
-
add symbol table from file "/usr/src/sys/modules/pf/pf.ko" at
-
.text_addr = 0xffffffff80e22040
-
(y or n) y
这样就完事了,可以跟踪调试内核模块了
阅读(3516) | 评论(0) | 转发(0) |