使用带有-g和-O2标志的gdb逐步过渡到上一行。删除-O2标志,它按预期工作。谁能解释为什么会这样?
我是eclipse CDT中的gdb新手,并使用“标准创建过程启动器”在C ++代码上使用它。
这是预期的行为还是有解决方案留下优化?
答案 0 :(得分:2)
这是预料之中的。编译器可以在更高的优化级别上重新排序代码。该手册页甚至说:
“没有任何优化选项, 编译器的目标是降低成本 编译和调试 产生预期的结果。“
这个目标必须在更高的层次上落下。
答案 1 :(得分:2)
优化可能会以某种意外的方式重新安排您的代码。优化代码中的调试信息将遵循这些重新安排。
答案 2 :(得分:2)
没有要求代码按照您编写的顺序执行,只是结果“可观察的行为”与 - 如果相同。
§1.9:
符合实施的最低要求是:
- 严格按照抽象机的规则评估对volatile对象的访问 - 在程序终止时,写入文件的所有数据应与根据抽象语义产生的程序执行的可能结果之一相同。
- 交互设备的输入和输出动态应以在程序等待输入之前提示输出实际传送的方式进行。构成交互设备的是实现定义的。这些统称为程序的可观察行为。