在GDB中如何在语句执行后、作用域退出前打印变量?
在GDB中如何在语句执行后、作用域退出前打印变量?
比如你遇到的这种情况:
for (int i = 0; i < 10; ++i) { int x = i * 2; // 想在这行执行后、离开循环体前打印x }
x是循环体内的局部变量,刚赋值完就要随着循环迭代被销毁,手动调试根本赶不上打印。别慌,我给你几个亲测好用的办法:
方法一:目标语句断点+自动命令(最推荐)
这是最直接的方式,能让程序自动在目标语句执行后打印变量,然后继续运行,完全不用手动干预:
- 先用
list命令查看代码,找到你要监控的那行(比如上面的int x = i * 2;在第3行) - 给该行下断点:
break 3(多文件项目要加文件名,比如break main.cpp:3) - 给这个断点设置自动执行的命令:输入
commands,回车后依次敲:print x(替换成你要打印的变量名)continue(让程序自动继续跑,不用你每次手动触发)- 最后输入
end结束命令配置
- 这样每次程序执行完第3行的赋值语句,就会自动打印x的值,然后直接进入下一次循环,完美抓住变量还在作用域内的时机
方法二:定位作用域结束前的位置
如果你的目标语句是块内最后一行,也可以在块的结束括号}前设置断点:
- 用
list找到}所在的行号,比如第4行 - 下断点:
break 4,同样用commands设置print x+continue - 这里要注意:程序停在
}这行时,变量x还没被销毁,此时打印也是有效的,只是时机比目标语句执行后稍晚一点,但同样能拿到正确的值
避坑小提示
要是遇到GDB说“找不到变量x”的情况,大概率是编译时开了优化!记得编译程序时加上-g -O0参数,保留完整调试信息,关闭编译器优化,这样局部变量就不会被编译器“优化没了”
内容来源于stack exchange
相关产品推荐
相关产品推荐

