代码之家  ›  专栏  ›  技术社区  ›  Justin L.

阻止gdb进入函数(或文件)

gdb
  •  24
  • Justin L.  · 技术社区  · 15 年前

    我有一些C++代码,就像我正在用GDB进行的那样:

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

    当我在 main() ,我想介入 foo() 但是我想走 结束 baz.get() .

    这个 GDB docs 如果“step命令只在函数有行号信息的情况下输入函数”,那么如果我可以删除 BAZ,GET() 从我的可执行文件。但理想情况下,我可以告诉gdb“永远不要进入baz类中的任何函数”。

    有人知道怎么做吗?

    5 回复  |  直到 9 年前
        1
  •  20
  •   Ciro Santilli OurBigBook.com    9 年前

    从GDB 7.4开始, skip 可以使用。

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

        2
  •  12
  •   Nick Bastin    15 年前

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

    (gdb) until foo
    

    我不知道如何将gdb永久配置为跳过某些符号(除了删除它们的调试信息)。

    编辑 :实际上,gdb文档声明,在跳到不在同一帧中的位置之前,不能使用。我不认为这是真的,但如果是这样,你可以用预付款来达到同样的目的:

    (gdb) advance foo
    

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

        3
  •  2
  •   codesniffer    9 年前

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

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

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

    skip dir /usr
    

    然后我再也不会在我的第三方头球中停球。

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

        4
  •  1
  •   Justin L.    15 年前

    这在GDB中似乎是不可能的。我提交了一份 bug .

        5
  •  1
  •   Philipp Claßen    11 年前

    同时,广发银行拥有 skip function 命令。只要在无趣的函数中执行它,它就不会再打扰您了。

    skip file 对于消除STL内部也非常有用。

    正如贾斯汀所说,它已经在GDB7.4中添加。有关详细信息,请查看 documentation .