kgdb拒绝只能访问某个驱动程序的符号,这些符号也不会出现在vmlinux中

时间:2013-10-23 21:06:37

标签: linux-kernel linux-device-driver

我正在尝试调试驱动程序。

gdb说...
(gdb)break i2c-hid.c:i2c_hid_suspend
没有名为i2c-hid.c的源文件 断点9(i2c-hid.c:i2c_hid_suspend)待定。

nm vmlinux ---在该文件中找不到任何函数名称。

cat / proc / kallsyms ---显示该文件中包含的所有函数名称。

我将它添加到Makefile“EXTRA_CFLAGS + = -DI2C-HID_DEBUG -g”无济于事。

有谁知道我需要做些什么才能让gdb能够看到这个文件中的符号?

我为许多其他驱动程序进行符号级调试。

2 个答案:

答案 0 :(得分:0)

看起来i2c-hid.c不是vmlinux的一部分,这意味着它不在基本内核之外。这就是nm vmlinux没有显示与此文件相关的符号的原因。

cat / proc / kallsyms将显示这些符号,因为它显示了包含驱动程序符号的所有内核符号,这些符号不属于vmlinux。

我不确定您是使用gdb还是kgdb,但我认为要调试驱动程序,您需要使用kgdb而不是gdb。

如果您已经在使用kgdb,请在其下使用add-symbol-file命令。它将帮助您加载vmlinux之外的符号。简单的谷歌搜索将为您提供大量的add-symbol-file信息。

答案 1 :(得分:0)

在调试Linux内核时,GDB不会像为用户模式共享库那样自动加载内核模块的符号。相反,您需要使用以下命令手动加载它们:

add-symbol-file <kernel module>.o <core address> -s <sectionX> <addressX> -s <...>

您可以通过在do_init_module()函数中设置断点并在遇到断点时检查mod变量来找出模块的核心地址(以及所有部分的地址):

print mod->name
print mod->module_core
print *mod->sect_attrs->attrs@mod->sect_attrs->nsections

您可以在Linux kernel symbol overview中阅读有关加载内核模块符号的更多信息。