Dun*_*ern 3 debugging xcode ios lldb
有时(意思是经常)当我尝试从iPad应用程序调试崩溃时,LLDB决定不太有用,并且变量(堆栈或类成员)的打印无法工作.
如果我在左侧的调试窗口中右键单击(或按住CTRL键并单击)一个变量,然后单击"打印描述",则会收到如下错误消息:
Printing description of error:
(NSURLError *) error = <register sp is not available>
Run Code Online (Sandbox Code Playgroud)
要么
Printing description of error:
(NSURLError *) error = <register ebp is not available>
Run Code Online (Sandbox Code Playgroud)
如果我自己尝试使用调试控制台,我会得到这样的结果:
(lldb) po error
(NSError *) $3 = 0x2124fc10 [no Objective-C description available]
Run Code Online (Sandbox Code Playgroud)
然后右键单击似乎开始工作并产生以下结果:
Printing description of error:
(NSURLError *) error = 0x2124fc10
Run Code Online (Sandbox Code Playgroud)
但我得到的只是内存地址,description它似乎无法调用它.如果我尝试发送description消息,则会发生这种情况:
(lldb) po [error description]
error: Execution was interrupted.
The process has been returned to the state before execution.
Run Code Online (Sandbox Code Playgroud)
所以这也没有帮助.可以做些什么来使调试器再次可用?我不得不赶上崩溃,但每次我都能挑起它,上面发生了,我不知道如何得到错误的核心.
我用谷歌搜索"注册不可用lldb",但没有发现任何东西,只是一些pastebin日志,没有答案.
仅供参考:使用Xcode 4.5.2,iOS SDK 6.0,编译"Debug"-Profile,未启用优化,LLDB调试器,iOS部署目标5.0,在模拟器或设备(iPad 1和3,iPhone 4S,iPhone)上进行调试时发生3GS),调试的App正在广泛使用GCD.
您正在使用i386上的易失性寄存器列表在Xcode 4.5.x中的lldb中遇到错误.
寄存器分为两类:易失性和非易失性(或被调用者保存).当函数调用另一个函数时,所有"易失性"寄存器都可能会覆盖其内容.所有非易失性/被调用者保存的寄存器将在被重用之前由被调用函数(被调用函数)保留,并且在返回之前恢复其先前的值.
有时调试信息会说变量存储在易失性寄存器中.如果该函数位于堆栈的中间并且您想要检查该变量,则调试器无法重建该寄存器的值 - 它将丢失.gdb只是简单地将易失性寄存器的值复制到堆栈的中间,并打印带有(可能)伪造值的变量,导致开发人员非常困惑.
lldb知道易失性和非易失性寄存器之间的区别,并且不会让易失性寄存器在堆栈中间重复使用 - 他们会说寄存器值不可用.
不幸的是,在这种情况下,你看到lldb声称它无法重建可用的变量.当它们应该是非易失性时,它们被错误归类为易失性.如果不进行大量的汇编语言检查,这对您来说并不容易.这里唯一的解决方案是恢复执行,直到你再次返回该函数(即它现在是第0帧),然后所有寄存器值将被正确标记为可用.
这在2013年9月发布的Xcode 5中得到修复.
| 归档时间: |
|
| 查看次数: |
3652 次 |
| 最近记录: |