0

在发布模式下在手机上运行调试器时,我们的调试器出现了一个奇怪的错误。无论我们是在 xcode 4.3.3 中使用 gdb 还是 lldb,即使代码的 PC 并未真正指向该点,代码也会落在断点上。

假代码示例:

if (true) {
    // set breakpoint-A here
} else {
    // set breakpoint-B here
}

// 在此处设置另一个断点-C。

它将降落在断点-B,然后跳转到断点-A。

是因为我们处于“发布”模式并且正在优化吗?

谢谢!

4

2 回答 2

3

是的,这里发生了三件事: 当您在发布模式下构建时,编译器正在优化代码生成。编译器可能会更改源代码行编译到程序中的顺序(只要不改变代码的含义),不同源代码行之间的指令可能会混合或重新排列,最后可能会出现行问题编译器发出的表。

想象一下两个源代码行,每个代码行都变成 8 条汇编语言指令。编译器可能会重新排列这 16 条指令(只要不改变它们的结果)以保持 CPU 最有效地运行。但是在这种情况下,编译器应该说什么指令相当于第 1 行?编译器应该说什么指令相当于第 2 行?

通过优化的代码调试,如果您在源代码级别进行调试,您必须接受这样一个现实,即“当前执行的源代码行”在您逐步执行程序时会反弹很多。似乎在范围内的变量会在不明显的时间出现和消失。编译器的方法很棘手且难以理解。您需要使用您面前的汇编语言代码(或源代码 + 汇编显示)进行调试,以真正了解正在发生的事情。

编译器和调试器可以进行一些改进来改进优化的代码源级调试,但可能总是有点难以遵循。

于 2012-09-29T01:53:07.390 回答
1

Xcode 也倾向于从方法中的任何 return 语句跳转到该方法中的第一个 return 语句。(Xcode 4.3.3 仍然可以。我还不确定 4.5。)

只需忽略最后突出显示的“返回”声明。

于 2012-10-03T02:04:00.003 回答