如何在gdb中根据特定条件打印变量?

6
我希望在一个被多次调用的函数中打印变量并且每次函数被调用时都能打印。是否可以通过gdb自动实现这个功能?类似于条件打印...像这样...
void func()
{ 
    if( t == 0 ) 
       x = z+1;
    else
       x = p+2; 
} 

当 t == 0 时,我希望变量被打印出来,否则忽略它。


1
[这份][1] GDB“备忘单”非常不错(我在调试时会随身携带一份双面覆膜的副本),而[这个][2]教程也很好。 [1]: http://www.tacc.utexas.edu/fileadmin/class_materials/gdb_refcard.pdf [2]: http://www.unknownroad.com/rtfm/gdbtut/gdbuse.html - William
1
gdb refcard的链接已经失效。可以在archive.org上找到它,网址为http://web.archive.org/web/20100611221250/http://www.tacc.utexas.edu/fileadmin/class_materials/gdb_refcard.pdf。 - Cristián Romo
不带条件部分的子集:https://dev59.com/42w15IYBdhLWcg3wmMx9 - Ciro Santilli OurBigBook.com
3个回答

7

可以通过以下命令组合来完成: breakpoint, condition, 和 commands

  1. 使用 breakpoint func 命令设置断点
  2. 使用 condition t == 0 命令将其设为条件断点
  3. 使用以下命令使断点打印本地变量:

.

commands  
info locals  
end  

使用以下方法指定特定变量:

commands  
print t
print z
print x  
end  

3
在代码的第x=z+1 行设置一个断点,使用'command [breakpoint number]'打印变量并继续执行。
这种方法适用于代码中有分支的情况。
如果没有if-else分支,您也可以使用'break if condition'并执行相应的命令。

+1,使用display _expr_可能更容易,因为每次达到断点时它都会自动打印_expr_的值。 - William

0

你实际上可以在特定条件下的某个地方中断。

例如,如果 x + y -foo(z) == 4,则 break sourcefile.c:123。如果该表达式计算为 true,则会在 sourcefile.c 的第 123 行中断。然后,您可以打印任何想要的值(或继续执行,直到下一次满足条件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接