2009-01-24 48 views
17

中的任何函数时,我想知道在使用某个文件中的函数时是否有任何方法来停止程序。理想的情况是什么,我期待的是一样的东西:使用gdb停止程序,当它使用文件X

GDB Stop when use a function from file foo.cpp 

之所以这样做是因为我调试的代码,是不是我的,我不知道到底是什么功能都被称为什么功能都没有。在GDB中是否有一个函数来执行我正在寻找的任务,或者是否有其他建议的方法来执行类似的操作?

感谢

+0

请接受:http://stackoverflow.com/a/478145/895245,它完全符合您当前GDB的需求。 – 2015-07-18 07:45:02

回答

21

步骤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手册页说这还没有实现。

+0

我打算说这样做,但实际上是+1。 =) – 2009-01-25 19:03:11

+1

似乎没有拿起静态函数。 – 2012-08-13 11:11:42

0

GDB断点有几个语法的... See here.

这不会对虽然文件中的任何功能突破....

编辑:你可以做些什么愚蠢的像使所有函数调用虚函数void foo(void)和内部断点。至少你会在文件内部破碎,并且应该很容易找到文件X的哪个函数被调用。

+0

foo函数并不是一个坏主意,问题是我有很多方法和文件,我可以使用的唯一选择是rbreak正则表达式。谢谢 – Eduardo 2009-01-24 01:37:32

2

就业俄罗斯的回答看起来很不错,但既然你说:

我不知道到底是什么功能 都被称为什么功能都没有 。

会的报告,其功能被击中,通过为gcov或东西代码覆盖工具,例如涉及Valgrind产生是一个很好的解决问题了吗?对正则表达式的正则表达式的所有功能

break foo.cpp:function-name 
1

可以使用命令。该命令在所有匹配项上设置无条件断点,并打印它设置的所有断点列表。一旦设置了这些断点,就会像使用break命令设置的断点一样对待它们。您可以删除它们,禁用它们,或者使其条件与其他任何断点相同。

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

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

+0

这只会打破一个功能,但问题在于所有功能。 – Herbert 2017-01-12 22:12:46

10

rbreak regex

设置断点:

1

rbreak foo.cpp:.

这里.匹配任何东西,并在文件foo.cpp的所有功能,所以休息。

相关问题