免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1912 | 回复: 0
打印 上一主题 下一主题

不使用KGDB 只用GDB+VMWARE 能调试内核模块吗 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-17 10:41 |只看该作者 |倒序浏览
看了精华区 http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest
文章 发现调试内核很简单 可是内核模块却不知道怎么调试 网上搜了很多资料 都找不到有用的

不知道 版主是怎么在 GDB+VMWARE 下调试内核模块的 (最好也能弄的跟前面的贴子一样详细)

贴个网上的例子 不过设置断点 却断不到 是不是一定要 KGDB 才能断到啊

 在调试发生于模块中的 panic, 或者使用远程 GDB 调试使用动态模块的机器时, 需要告诉 GDB 如何获取这些模块的符号信息。

  首先, 需要在编译模块时加入调试信息:

# cd /sys/modules/linux
# make clean; make COPTS=-g

  如果使用远程 GDB, 您可以在目标机上执行 kldstat 来了解模块的加载位置:

# kldstat
Id Refs Address    Size     Name
1    4 0xc0100000 1c1678   kernel
2    1 0xc0a9e000 6000     linprocfs.ko
3    1 0xc0ad7000 2000     warp_saver.ko
4    1 0xc0adc000 11000    linux.ko

  如果您正调试内核崩溃转存数据, 则需要访问 linker_files 表, 从 linker_files->tqh_first 开始, 并沿 link.tqe_next 指针寻找包含您所查找的 filename 的项。 那个项的 address 成员就是模块的加载地址。

  接下来, 您需要找出模块中代码节 (text section) 的偏移量:

# objdump --section-headers /sys/modules/linux/linux.ko | grep text
  3 .rel.text     000016e0  000038e0  000038e0  000038e0  2**2
10 .text         00007f34  000062d0  000062d0  000062d0  2**2

  您需要的是 .text 节, 在前述例子中, 是 10 号节。第四个十六进制字段 (或者说从左往右数第六个字段) 是代码节在文件中的偏移量。将这一偏移量与模块的加载地址相加, 就可以得到模块的代码在重定位之后的地址了。在我们的例子中, 可以得到 0xc0adc000 + 0x62d0 = 0xc0ae22d0。 接下来就可以用 add-symbol-file 来告诉 GDB 关于调试模块的信息:

(kgdb) add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0
add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
(y or n) y
Reading symbols from /sys/modules/linux/linux.ko...done.
(kgdb)

[ 本帖最后由 xiongce 于 2008-1-17 11:29 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP