在发布模式下在手机上运行调试器时,我们的调试器出现了一个奇怪的错误。无论我们使用gdb还是lldb和xcode 4.3.3,代码都将落在断点上,即使代码的PC并没有真正指向那个位置。
虚假代码示例:
if (true) {
// set breakpoint-A here
} else {
// set breakpoint-B here
}
//在这里设置另一个断点-C。
它将在断点-B处着陆,然后跳到断点-A。
原因是因为我们处于“发布”模式并且正在优化吗?
谢谢!
答案 0 :(得分:3)
是的,这里有三件事:当您在发布模式下构建时,编译器正在进行优化的代码生成。编译器可能会更改源代码行编译到程序中的顺序(只要它不会改变代码的含义),不同源代码行之间的指令可能会混合或重新排列,最后可能会出现问题。编译器发出的表。
想象一下两个源代码行,每个代码行转换为8个汇编语言指令。编译器可以重新排列这16条指令(只要它不改变它们的结果),以保持CPU的运行效率最高。但在这种情况下,编译器应该说什么指令等同于第1行?编译器应该说什么指令等同于第2行?
通过优化代码调试,如果您在源代码级别进行调试,则必须遵循“当前正在执行的源代码行”在您单步执行程序时会反复出现的现实。似乎在范围内的变量将在非显而易见的时间出现和消失。编译器的方法很棘手,难以理解。您需要使用前面的汇编语言代码(或源代码+汇编显示)进行调试,以真正了解正在发生的事情。
编译器和调试器可以进行改进,以改进优化的代码源级调试,但可能总是有点难以理解。
答案 1 :(得分:1)
Xcode也倾向于从方法中的任何return语句跳转到该方法中的第一个return语句。 (Xcode 4.3.3仍然可以。我还不确定4.5。)
忽略最后突出显示的'return'语句。