我目前正在调试一个内核模块,为此,我使用调试信息构建了整个内核(产生 kallsyms 等......)。
当我尝试时nm my_module.ko
,我得到了我的模块包含的符号列表。一切都很好,只是有些符号有点丢失,因为它们没有出现在符号列表中。我对此的感觉是相关函数正在自动内联。
无论如何,当使用 qemu-kgdb/gdb 运行内核时,我可以看到调用了“缺失”函数。这意味着编译器没有将其清除,因为它从未在任何代码路径中使用过(因此是我的“感觉”)。
由于符号没有出现,我无法在其上设置断点,gdb 不会展开它,以便我可以看到正在运行的代码路径 - 明白我不知道如何告诉 gdb 展开它。
不幸的是,我想看看这部分代码路径......我该怎么做?
编辑:正如汤姆的回答中所建议的,我尝试使用如下file:line
语法:
我的代码文件如下所示:
int foo(int arg) // The function that I suspect to be inlined - here is line 1
{
/* Blabla */
return 42;
}
void foo2(void)
{
foo(0); // Line 9
}
我试过b file.c:1
了,断点被击中,但foo()
函数没有展开。当然,我正在生成调试符号,因为我还设置了一个断点foo2
来检查发生了什么(效果很好)。