gpt4 book ai didi

c - 为什么缺少一些调试符号以及如何跟踪它们?

转载 作者:太空宇宙 更新时间:2023-11-04 08:56:11 24 4
gpt4 key购买 nike

我目前正在调试一个内核模块,为此,我使用调试信息构建了整个内核(生成 kallsyms 等...)。

当我尝试 nm my_module.ko 时,我得到了我的模块包含的符号列表。一切都很好,只是有些符号有点丢失,因为它们没有出现在符号列表中。我对此的感觉是相关函数正在自动内联。

无论如何,当使用 qemu-kgdb/gdb 运行内核时,我能够看到调用了“缺失”函数。这意味着编译器没有清除它,因为它从未在任何代码路径中使用过(因此我的“感觉”)。

由于符号没有出现,我无法在其上设置断点,gdb 也不会展开它以便我可以看到运行代码路径 - 理解 我不知道如何告诉 gdb展开它
不幸的是,我想查看代码路径的这一部分......我该怎么做?

EDIT :正如 Tom 的回答中所建议的,我尝试使用 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 上设置了一个断点来检查发生了什么(效果很好)。

最佳答案

你没有说明你使用的是什么版本的 gdb。

非常旧的 gdb 版本不支持内联函数。对于 6.8 甚至 7.0 都是如此——我不记得了。你可以看看你的 gdb 的 NEWS 文件。

然后有一些版本的 gdb 支持在内联函数上的断点,但只使用“file:line”语法。所以你要做的是在你的编辑器中查找函数,找到它的行号并输入,例如:

(gdb) break myfile.c:777

即使是从 7.4 或 7.5(我忘记了)开始的更新版本的 gdb,如果内联了“函数”,也能很好地处理“中断函数”。

所有这些只有在您有可用的调试信息时才有效。因此,如果您尝试了此操作但失败了,要么是您的 gdb 较旧,要么是您忘记使用 -g。

在 gdb 中没有很好的方法来查看编译中缺少哪些对象 -g。不过,通过在 .o 文件上运行“readelf -WS”并查找没有 .debug_info 部分的文件,您可以很容易地从 shell 中看到它。

关于c - 为什么缺少一些调试符号以及如何跟踪它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16897576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com