不使用KGDB 只用GDB+VMWARE 能调试内核模块吗 - 内核源码
来源:百度文库 编辑:神马文学网 时间:2024/07/07 09:00:23
看了精华区 [url]http://linux.chinaunix.net/bbs/viewthread.php?tid=896214&extra=page%3D1%26amp%3Bfilter%3Ddigest[/url]
文章 发现调试内核很简单 可是内核模块却不知道怎么调试 网上搜了很多资料 都找不到有用的
不知道 版主是怎么在 GDB+VMWARE 下调试内核模块的 (最好也能弄的跟前面的贴子一样详细)
贴个网上的例子 不过设置断点 却断不到 是不是一定要 KGDB 才能断到啊
[quote] 在调试发生于模块中的 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)
[/quote]
文章 发现调试内核很简单 可是内核模块却不知道怎么调试 网上搜了很多资料 都找不到有用的
不知道 版主是怎么在 GDB+VMWARE 下调试内核模块的 (最好也能弄的跟前面的贴子一样详细)
贴个网上的例子 不过设置断点 却断不到 是不是一定要 KGDB 才能断到啊
[quote] 在调试发生于模块中的 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)
[/quote]
不使用KGDB 只用GDB+VMWARE 能调试内核模块吗 - 内核源码
vmware + kgdb + linux2.6.15内核调试配置
在vmware上建立kgdb调试linux kernel源码的平台-1
linux内核模块编程
linux内核模块编程
Linux 系统内核的调试
[原创]在2.6内核下不编译内核给iptables添加模块
linux内核模块编程s
linux内核模块编程11
Gdb调试精粹及使用实例
GDB调试精粹及使用实例
GDB调试精粹及使用实例
GDB调试精粹及使用实例
Gdb调试精粹及使用实例
Linux内核源码的组织结构
Linux 可加载内核模块剖析
Linux 可加载内核模块剖析
Linux 可加载内核模块剖析
kgdb调试环境搭建
系统内核升级后 VMware 不能运行的解决办法 - LinuxTOY
Gdb调试精粹及使用实例--ada的博客
新爆内核高危漏洞sock_sendpage的利用分析的讨论 - 内核源码 - Linux论...
何把内核中的信息打印到文件 - 内核源码 - Linux论坛
Linux 内核软中断执行分析|Linux,内核,软中断,softirq,分析,编程-中国源码网