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

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

我有一个函数a()在代码中的许多地方调用.我想在其中设置一个断点,但前提是它是从b()调用的.有什么办法吗?

有没有办法只有在从c()调用b()时才这样做,等等无限广告?

解决方法:

更新:这个问题现在有一个better answer:使用GDB _is_caller便利功能.

您描述的需求经常出现,通常是在some_utility_fn被调用很多的情况下,但您只对some_other_fn中的调用感兴趣.

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

如果没有Python,你可以做的事情是有限的,但通常的技术是在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

Voila:我们停止了从b()调用的(),忽略了之前100次调用a().

上一篇:C#中的调用堆栈限制


下一篇:c – 堆栈框架的大小总是固定的?