我正在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().