0

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

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 能够看到该文件中的符号?

我得到了许多其他驱动程序的符号级调试。

4

2 回答 2

0

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

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

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

如果您已经在使用 kgdb,请在其下使用 add-symbol-file 命令。它将帮助您加载 vmlinux 之外的符号。简单的谷歌搜索会给你很多添加符号文件的信息。

于 2013-10-24T09:42:42.417 回答
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 内核符号概述中阅读有关加载内核模块符号的更多信息。

于 2014-03-17T03:08:22.383 回答