Linux kernel kgdb拒绝只访问一个特定驱动程序的符号,这些符号也不会出现在vmlinux中

Linux kernel kgdb拒绝只访问一个特定驱动程序的符号,这些符号也不会出现在vmlinux中,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,我正在调试一个驱动程序 gdb说… (gdb)断开i2c hid。c:i2c\u hid\u挂起 没有名为i2c hid.c的源文件。 断点9(i2c hid.c:i2c\u hid\u suspend)挂起 nm vmlinux---在该文件中找不到任何函数名 cat/proc/kallsyms---显示该文件中包含的所有函数名 我将其添加到Makefile“EXTRA_CFLAGS+=-DI2C-HID_DEBUG-g”中,但没有效果 有人知道我需要做什么才能让gdb看到这个文件中的符号吗

我正在调试一个驱动程序

gdb说…
(gdb)断开i2c hid。c:i2c\u hid\u挂起
没有名为i2c hid.c的源文件。
断点9(i2c hid.c:i2c\u hid\u suspend)挂起

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

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

我将其添加到Makefile“EXTRA_CFLAGS+=-DI2C-HID_DEBUG-g”中,但没有效果

有人知道我需要做什么才能让gdb看到这个文件中的符号吗


我对很多其他驱动程序进行了符号级调试。

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

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

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


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

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

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

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

好的,我想这是一篇关于如何使用添加符号文件的好文章。ThxBTW也许“不是vmlinux的一部分”的最佳措辞是“它是一个可加载的模块”,对吗。也就是说,我可以用这个内置模块重新编译内核,然后它的符号将成为vmlinux的一部分,对吗?是的,我自己没有尝试过,但是是的,理论上通过构建内置模块,你的问题可以解决。毫无疑问,你给出了正确的答案,但我的系统似乎还缺少其他东西。我无法获得我应该能够得到的已解析地址。我试过这个:kldstat说没找到。cat/proc/kallsyms | grep i2c_hid--显示每个符号旁边的所有0000000000。cat/sys/module/i2c_hid/sections/.text——只是一个0x0000000000000000,我还缺少什么?
print mod->name
print mod->module_core
print *mod->sect_attrs->attrs@mod->sect_attrs->nsections