【发布时间】:2013-06-03 13:12:43
【问题描述】:
我目前正在调试一个内核模块,为此,我使用调试信息构建了整个内核(生成 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 设置了一个断点来检查发生了什么(效果很好)。
【问题讨论】:
-
您是否尝试在特定行而不是符号上设置断点?此外,您可以强制编译器不要内联代码。
-
您是否使用了一些剥离选项??