使用gdb在使用文件X中的任何函数时停止程序

时间:2009-01-24 01:23:13

标签: gdb

我想知道在使用某个文件中的函数时是否有任何方法可以停止程序。理想情况下,我正在寻找的是:

GDB Stop when use a function from file foo.cpp

这样做的原因是因为我正在调试一个不属于我的代码,而且我不确切地知道调用了哪些函数以及哪些函数不是。 GDB中是否有功能可以执行我要查找的内容,或者其他任何建议的类似方法?

谢谢

6 个答案:

答案 0 :(得分:22)

步骤1:构建foo.cpp中定义的所有函数的列表 我能想到的最简单的方法(假设你有binutils和GNU grep):

nm a.out | grep ' T ' | addr2line  -fe a.out |
  grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist

步骤2:构建一个GDB脚本,该脚本将为上述每个函数设置一个断点:

sed 's/^/break /' funclist > stop-in-foo.gdb

[显然,步骤1和2可以合并; - ]

第3步:实际设置断点:

gdb a.out
(gdb) source stop-in-foo.gdb

查看this答案,更简单一点(如果您使用的是Fedora Linux),找出调用哪些foo.cpp函数:

ftrace -sym='foo.cpp#*' ./a.out

太糟糕的ftrace手册页说这还没有实现。

答案 1 :(得分:12)

<强> rbreak regex

在与正则表达式正则表达式匹配的所有函数上设置断点。此命令在所有匹配项上设置无条件断点,打印它设置的所有断点的列表。设置这些断点后,它们将被视为与使用break命令设置的断点一样。您可以删除它们,禁用它们,或者以与任何其他断点相同的方式使它们成为条件。

正则表达式的语法是与`grep'等工具一起使用的标准语法。请注意,这与shell使用的语法不同,因此例如foo *匹配包含fo后跟零或多个os的所有函数。有一个隐含的。*前导和尾随你提供的正则表达式,所以为了只匹配以foo开头的函数,使用^ foo。

在调试C ++程序时,rbreak对于在非重载函数上设置断点非常有用,这些函数不是任何特殊类的成员。

答案 2 :(得分:5)

<强> rbreak foo.cpp:.

此处.匹配任何内容,因此会中断文件foo.cpp的所有功能。

答案 3 :(得分:2)

受雇俄罗斯人的回答看起来非常好,但既然你说:

  

我不确切知道哪些功能   被称为什么功能   不

通过代码覆盖率工具(例如gcov或某些涉及Valgrind的内容)生成哪些功能的报告是否可以很好地解决您的问题?

答案 4 :(得分:1)

您可以使用命令:

break foo.cpp:function-name

答案 5 :(得分:0)

gdb断点有两种语法... See here.

虽然不会破坏文件中的任何功能....

编辑:你可以做一些愚蠢的事情,就像让所有函数调用虚函数void foo(void)和断点一样。至少你会破坏文件内部,并且应该很容易找到文件X侧面的哪个函数被调用。