我正在使用 gdb 调试 C++ 程序。
我有这个代码:
int x = floor(sqrt(3));
我想查看 x 的值。但是,gdb 声称 x 是“
原文由 dangerChihuahua007 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在使用 gdb 调试 C++ 程序。
我有这个代码:
int x = floor(sqrt(3));
我想查看 x 的值。但是,gdb 声称 x 是“
原文由 dangerChihuahua007 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用逆向调试时,尽量往后退一步靠近变量的定义点
如图: gdb中
<optimized out>
,因为由于优化,它仅存储在寄存器中,而不是堆栈上的内存中。因此,当不再需要它时,寄存器很可能会被另一个变量重用和覆盖,然后调试元数据会通知 GDB。因此,如果您正在使用某种 反向调试,例如 Mozilla rr
,一旦您尝试一次就会一直这样做,那么一个好的选择是尝试并退后一步接近变量的定义/上次使用 reverse-finish
+ reverse-next
看看你是否可以在那里观察到它。
这可以通过示例代码中的示例代码具体观察到, <值优化输出>在 gdb 中的含义是什么? 并且救了我几次,尤其是在运行未优化的程序时,它需要很长时间才能到达感兴趣的点(这并不奇怪,因为 -O0
生成的程序集效率极低,如该答案所示)。
原文由 Ciro Santilli OurBigBook.com 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
如您在此处所见,在高优化级别上,编译器可以消除中间值。有多种选择:
-O0
肯定可以工作(但会慢很多),-O1
也可以正常工作。