我想知道在使用某个文件中的函数时是否有任何方法可以停止程序。理想情况下,我正在寻找的是:
GDB Stop when use a function from file foo.cpp
这样做的原因是因为我正在调试一个不属于我的代码,而且我不确切地知道调用了哪些函数以及哪些函数不是。 GDB中是否有功能可以执行我要查找的内容,或者其他任何建议的类似方法?
谢谢
答案 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)
受雇俄罗斯人的回答看起来非常好,但既然你说:
我不确切知道哪些功能 被称为什么功能 不
答案 4 :(得分:1)
您可以使用命令:
break foo.cpp:function-name
答案 5 :(得分:0)
gdb断点有两种语法... See here.
虽然不会破坏文件中的任何功能....
编辑:你可以做一些愚蠢的事情,就像让所有函数调用虚函数void foo(void)和断点一样。至少你会破坏文件内部,并且应该很容易找到文件X侧面的哪个函数被调用。