前面的博文里介绍过如果用串口进行远程kernel调试,但如何调试可加载的内核模块呢?
我们举例加以介绍:假设想调试目标主机上的pf.ko,先去目标主机获得以下东西:
  1. $ kldstat
  2. Id Refs Address Size Name
  3. 1 2 0xffffffff80100000 b4afb8 kernel
  4. 2 1 0xffffffff80e22000 2b150 pf.ko
主要是获得目标主机的pf.ko模块的加载地址“0xffffffff80e22000”

然后再开发机上按-g方式编译模块,编译好之后,要用objdump查看,找到在内核模块中,文本段的偏移量
  1. [root@fb73_vm114 /usr/src/sys/modules/pf]# objdump --section-headers ./pf.ko | grep text
  2. 0 .text 0002776f 0000000000000000 0000000000000000 00000040 2**4
取16进制模式的第4个数据,这里是00000040,和前面的地址“0xffffffff80e22000”加一起获得一个值“0xFFFFFFFF80E22040”,这个值就是内核模块文本段在内核中的加载地址。
这时把内核模块的符号加入gdb
  1. (kgdb) add-symbol-file /usr/src/sys/modules/pf/pf.ko 0xFFFFFFFF80E22040
  2. add symbol table from file "/usr/src/sys/modules/pf/pf.ko" at
  3. .text_addr = 0xffffffff80e22040
  4. (y or n) y
这样就完事了,可以跟踪调试内核模块了
10-23 21:05