当程序使用文件 X 中的任何函数时,使用 gdb 停止程序
Posted
技术标签:
【中文标题】当程序使用文件 X 中的任何函数时,使用 gdb 停止程序【英文标题】:Using gdb stop the program when it is using any function from file X 【发布时间】:2010-10-03 06:45:51 【问题描述】:我想知道在使用某个文件中的函数时是否有任何方法可以停止程序。理想情况下,我正在寻找的是:
GDB Stop when use a function from file foo.cpp
这样做的原因是因为我正在调试一个不属于我的代码,并且我不确切知道哪些函数被调用,哪些函数没有被调用。 GDB 中是否有一个函数可以做我正在寻找的事情,或者任何其他推荐的方法来做类似的事情?
谢谢
【问题讨论】:
【参考方案1】:第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 步可以合并;-]
第三步:实际设置断点:
gdb a.out
(gdb) source stop-in-foo.gdb
查看this 的答案,一个更简单的方法(如果你在 Fedora Linux 上)找出调用了哪些 foo.cpp 函数:
ftrace -sym='foo.cpp#*' ./a.out
太糟糕了ftrace 手册页说这还没有实现。
【讨论】:
我本来想说要这样做,但实际上是 +1。 =) 似乎不支持静态函数。【参考方案2】:rbreak regex
在所有匹配正则表达式正则表达式的函数上设置断点。此命令在所有匹配项上设置一个无条件断点,打印它设置的所有断点的列表。一旦设置了这些断点,它们将被视为使用 break 命令设置的断点。您可以像任何其他断点一样删除、禁用它们或使它们有条件。
正则表达式的语法是与 `grep' 等工具一起使用的标准语法。请注意,这与 shell 使用的语法不同,例如 foo* 匹配所有包含 fo 后跟零个或多个 os 的函数。您提供的正则表达式有一个隐含的 .* 前导和尾随,因此要仅匹配以 foo 开头的函数,请使用 ^foo。
在调试 C++ 程序时,rbreak 对于在不是任何特殊类成员的重载函数上设置断点很有用。
【讨论】:
这对我帮助很大!虽然我猜这不是公认的答案,因为它匹配函数名而不是它所在文件的文件名。【参考方案3】:rbreak foo.cpp:.
这里.
匹配任何内容,因此会中断文件foo.cpp
的所有功能。
【讨论】:
【参考方案4】:Employed Russian 的回答看起来很不错,但既然你说:
我不知道具体是什么功能 被调用了,函数是什么 不是。
由代码覆盖工具(例如gcov 或涉及Valgrind 的内容生成的报告)是否可以很好地解决您的问题?
【讨论】:
【参考方案5】:你可以使用命令:
break foo.cpp:function-name
【讨论】:
这只会中断一个函数,但问题是所有函数。rbreak foo.cpp:.
将中断来自foo.cpp
的与正则表达式.
匹配的所有函数(即来自foo.cpp
的所有函数)。【参考方案6】:
gdb 断点有几种语法...See here.
它不会中断文件中的任何函数......
编辑:你可以做一些愚蠢的事情,比如让所有函数调用一个虚拟函数 void foo(void),并在里面设置断点。至少你会破坏文件内部,并且应该很容易找到文件 X 中的哪个函数正在被调用。
【讨论】:
foo 函数不是一个坏主意,问题是我有很多方法和文件,也许我可以使用的唯一选项是 rbreak 正则表达式。谢谢以上是关于当程序使用文件 X 中的任何函数时,使用 gdb 停止程序的主要内容,如果未能解决你的问题,请参考以下文章