我想知道在使用某个文件中的函数时是否有任何方法可以停止程序.理想情况下,我正在寻找的是:
GDB Stop when use a function from file foo.cpp
这样做的原因是因为我正在调试一个不是我的代码而且我不确切地知道调用了哪些函数以及哪些函数不是.GDB中是否有功能可以执行我要查找的内容,或者其他任何推荐的方法来执行类似的操作?
谢谢
第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
看看这个答案,一个更简单的(如果你在Fedora Linux上)的方法来找出调用哪些foo.cpp函数:
ftrace -sym='foo.cpp#*' ./a.out
太糟糕的ftrace手册页说这还没有实现.
rbreak regex
在与正则表达式正则表达式匹配的所有函数上设置断点.此命令在所有匹配项上设置无条件断点,打印它设置的所有断点的列表.设置这些断点后,它们将被视为与使用break命令设置的断点一样.您可以删除它们,禁用它们,或者以与任何其他断点相同的方式使它们成为条件.
正则表达式的语法是与`grep'等工具一起使用的标准语法.请注意,这与shell使用的语法不同,因此例如foo*匹配包含fo后跟零或多个os的所有函数.有一个隐含的.*前导和尾随你提供的正则表达式,所以为了只匹配以foo开头的函数,使用^ foo.
在调试C++程序时,rbreak对于在非重载函数上设置断点非常有用,这些函数不是任何特殊类的成员.
rbreak foo.cpp:.
这里.
匹配任何东西,因此打破了文件的所有功能foo.cpp
.