防止 GDB 单步执行函数(或文件)

Posted

技术标签:

【中文标题】防止 GDB 单步执行函数(或文件)【英文标题】:Preventing GDB from stepping into a function (or file) 【发布时间】:2010-11-11 03:02:49 【问题描述】:

我有一些像这样的 C++ 代码,我正在逐步使用 GDB:

void foo(int num)  ... 

void main() 
  Baz baz;
  foo (baz.get());

当我在main() 时,我想跨入foo(),但我想跨步 baz.get()

GDB docs 说“只有在函数有行号信息时,step 命令才会进入函数”,所以如果我可以从我的可执行文件中删除 baz.get() 的行号信息,我会很高兴。但理想情况下,我可以告诉 GDB“永远不要进入 Baz 类中的任何函数”。

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

从 GDB 7.4 开始,可以使用skip

运行info skip,或查看手册了解详细信息:https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html

【讨论】:

【参考方案2】:

您可以使用“直到”命令通常以您希望的方式运行,而不是选择“步进”:

(gdb) until foo

我不知道有什么方法可以永久配置 gdb 以跳过某些符号(除了省略它们的调试信息)。

编辑:实际上,GDB 文档指出您不能使用 until 跳转到不在同一帧中的位置。我不认为这是真的,但如果是这样,您可以将 Advance 用于相同的目的:

(gdb) advance foo

GDB 手册的第 85 页定义了哪些可以用作接受它们的命令的“位置”参数。只要加上“foo”就会让它寻找一个名为 foo 的函数,所以只要它可以找到它,你应该没问题。或者,您被困在为 foo 键入文件名:linenum 之类的东西时,在这种情况下,您最好在 foo 上设置断点并使用 continue 前进。

【讨论】:

太酷了!这不是我要找的——即使使用 GDB 的函数名,输入全名也有点乏味,所以我更喜欢将函数或整个文件列入黑名单。但它比我拥有的要好得多。【参考方案3】:

(我认为这可能更适合作为评论而不是答案,但我还没有足够的声誉来添加评论。)

所以我也一直想在调试一段时间时忽略 STL、Boost 等(统称为“第 3 方”)文件。昨天我终于决定寻找一个解决方案,似乎最接近的功能是 GDB 中的“跳过”命令。

我发现 GDB 中的“跳过”功能很有帮助,但这对我来说仍然很麻烦,因为我的程序使用了很多 STL 和其他“第 3 方”模板代码。在这种情况下,我必须将一堆文件标记为跳过。在第二次这样做之后,我意识到能够跳过整个目录会更有帮助——跳过一个目录和所有子目录最有帮助。这样我就可以跳过,例如,/usr 因为我的代码都不存在那里,而且我通常对通过 3rd 方代码进行调试没有兴趣。所以我扩展了gdb中的'skip'命令来支持一种新的'dir'类型。我现在可以在 gdb 中执行此操作:

skip dir /usr

然后我从未停止过任何第 3 方标头。

这是一个包含此信息的网页 + 补丁(如果对任何人有帮助):info & patch to skip directories in GDB

【讨论】:

【参考方案4】:

这在 GDB 中似乎是不可能的。我已经提交了bug。

【讨论】:

【参考方案5】:

同时,gdb 有skip function 命令。当你在无趣的函数中时执行它,它不会再打扰你了。

skip file 对于摆脱 STL 内部结构也非常有用。

正如贾斯汀所说,它已被添加到 gdb 7.4 中。更多详情,请查看documentation。

【讨论】:

以上是关于防止 GDB 单步执行函数(或文件)的主要内容,如果未能解决你的问题,请参考以下文章

使用 gdb 对指定可执行文件之外的单步汇编代码导致错误“找不到当前函数的边界”

GDB 调试多线程程序的总结

gdb 中step,next与finish的区别

gdb 常用选项

GDB 防止错误

gdb调试