当程序使用文件 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 停止程序的主要内容,如果未能解决你的问题,请参考以下文章

C程序在GDB中运行,在自己运行时崩溃

仅当函数的返回值等于“Value”时,gdb 是不是可以在函数上以非交互方式有条件地中断?

gdb 错误 - 文件不是可执行格式:文件格式无法识别

GDB:当没有可用的名称符号时如何打印函数参数值

是否可以使用 GDB 查看未命名的框架/函数参数?

这是 ubuntu 16.04 中的 gdb 错误吗?