防止GDB单步进入函数(或文件) 我有一些C++代码,我正在用gdB: void foo(int num) { ... } void main() { Baz baz; foo (baz.get()); }

防止GDB单步进入函数(或文件) 我有一些C++代码,我正在用gdB: void foo(int num) { ... } void main() { Baz baz; foo (baz.get()); },gdb,Gdb,当我在main()中时,我想进入foo(),但我想跨过baz.get() 他们说“如果函数有行号信息,step命令只会进入函数”,因此如果我能从可执行文件中删除baz.get()的行号信息,我会很高兴。但理想情况下,我可以告诉GDB“永远不要进入Baz类中的任何函数” 有人知道怎么做吗?您可以使用“直到”命令,而不是选择“单步执行”,通常按照您希望的方式执行: (gdb) until foo 我不知道有什么方法可以永久地配置gdb来跳过某些符号(除了删除它们的调试信息) 编辑:实际上,GDB文

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

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

有人知道怎么做吗?

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

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

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

(gdb) advance foo

GDB手册的第85页定义了什么可以用作接受它们的命令的“位置”参数。只需输入“foo”将使它查找名为foo的函数,所以只要它能够找到它,您就可以了。或者,您无法键入诸如filename:linenum for foo之类的内容,在这种情况下,您最好在foo上设置一个断点并使用continue前进到它。

在GDB中,这似乎是不可能的。我已经提交了一个文件。

从GDB 7.4开始,可以使用
跳过


运行
info skip
,或查看手册了解详细信息:

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

跳过文件
对于去除STL内部结构也非常有用

正如Justin所说,它已添加到GDB7.4中。有关更多详细信息,请查看。

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

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

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

skip dir /usr
然后,我从来没有停止在我的任何第三方标题


这里有一个网页,其中包含此信息和补丁,如果它对任何人都有帮助的话:

太酷了!这并不完全是我想要的——即使使用GDB的函数名,键入全名也有点乏味,所以我更喜欢黑名单函数或整个文件。但这比我拥有的好多了。