有没有办法在 gdb 中设置一个以调用堆栈为条件的断点?

2024-04-24

我正在 Linux 上的 gdb 7.1 中调试 C++。

我有一个函数a()代码中很多地方都会调用它。我想在其中设置一个断点,但前提是它是从b()。有什么办法可以做到吗?

有没有办法做到这一点,只有当b()被叫自c(),等等无穷无尽?


Update:现在有一个更好的答案 https://stackoverflow.com/a/55358445/50617对于这个问题:使用GDB_is_caller便利功能。

您描述的需求经常出现,通常是在以下背景下some_utility_fn被多次呼叫,但您只对来自的呼叫感兴趣some_other_fn.

您可以使用来自 CVS 主干的 GDB 中新的嵌入式 Python 支持来编写整个交互的脚本。

如果没有 Python,你能做的事情就会受到限制,但通常的技术是拥有一个disabled断点a(),并通过附加到断点的命令启用它b().

这是一个例子:

int a(int x)
{
  return x + 1;
}

int b()
{
  return a(1);
}

int call_a_lots()
{
  int i, sum = 0;
  for (i = 0; i < 100; i++)
    sum += a(i);
}

int main()
{
  call_a_lots();
  return b();
}

gcc -g t.c
gdb -q ./a.out
Reading symbols from /tmp/a.out...done.
(gdb) break a
Breakpoint 1 at 0x4004cb: file t.c, line 3.
(gdb) disable 1
(gdb) break b
Breakpoint 2 at 0x4004d7: file t.c, line 8.
(gdb) command 2
>silent
>enable 1
>continue
>end
(gdb) run

Breakpoint 1, a (x=1) at t.c:3
3     return x + 1;
(gdb) bt
#0  a (x=1) at t.c:3
#1  0x00000000004004e1 in b () at t.c:8
#2  0x000000000040052c in main () at t.c:21
(gdb) q

瞧:我们已经停下来了a()打电话自b(),忽略之前的 100 个调用a().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在 gdb 中设置一个以调用堆栈为条件的断点? 的相关文章

随机推荐