防止GDB进入函数(或文件)

时间:2009-07-15 19:14:12

标签: gdb

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

void foo(int num) { ... }

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

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

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

有谁知道怎么做?

5 个答案:

答案 0 :(得分:20)

从GDB 7.4开始,可以使用skip

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

答案 1 :(得分:12)

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

(gdb) until foo

我不知道如何永久配置gdb跳过某些符号(除了忽略调试信息)。

编辑:实际上,GDB文档声明直到跳转到不在同一帧中的位置才能使用。我不认为这是真的,但如果是这样的话,你可以将advance用于同样的目的:

(gdb) advance foo

GDB手册的第85页定义了可以用作获取它们的命令的“位置”参数的内容。只要输入“foo”就会让它找到一个名为foo的函数,所以只要它能找到它,你应该没问题。或者你会忘记键入文件名:linenum for foo,在这种情况下你可能最好不要在foo上设置断点并使用继续前进到它。

答案 2 :(得分:2)

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

因此,在调试一段时间后,我也一直想忽略STL,Boost等人(统称为“第三方”#)文件。昨天我终于决定寻找一个解决方案,看起来最接近的功能就是“跳过”' GDB中的命令。

我找到了'跳过' GDB的能力很有帮助,但它对我来说仍然是一件麻烦事,因为我的程序使用了大量的STL和其他的#3;第三方"模板代码。在这种情况下,我必须将一堆文件标记为跳过。在第二次这样做之后,我意识到能够跳过整个目录会更有帮助 - 并且最有助于跳过目录和所有子目录。这样我可以跳过,例如/ usr,因为我的代码都不在那里,我通常没有兴趣通过第三方代码进行调试。所以我延长了'跳过' gdb中的命令支持新类型' dir'我现在可以在gdb中执行此操作:

skip dir /usr

然后我的任何第三方标题都没有停止过。

这是一个带有此信息的网页+补丁,如果它可以帮助任何人:info & patch to skip directories in GDB

答案 3 :(得分:1)

在GDB中似乎无法做到这一点。我已经提交了bug

答案 4 :(得分:1)

同时,gdb具有skip function命令。只要你在无趣的功能里面执行它就不会再打扰你了。

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

正如Justin所说,已经在gdb 7.4中添加了它。有关详细信息,请查看documentation