区分LLDB中的iOS模拟器和设备

时间:2013-01-17 04:05:19

标签: ios xcode breakpoints lldb

在Xcode中,您可以设置具有评估抛出异常描述的条件的断点,以确定是否在该断点上停止。这在使用Core Data时特别有用,因为Core Data会在内部抛出异常作为控制流机制,并且您希望停止异常,而不是Core Data。 (注意:如果您想知道如何按照描述过滤异常,则会在SO问题Ignore certain exceptions when using Xcode's All Exceptions breakpoint上回答。)

但是,这些过滤器通常依赖于寄存器的内容,因为异常的地址存储在那里。在模拟器中(在英特尔架构上运行),寄存器为$eax,但在设备(ARM体系结构)上,它是$r0

是否有可能创建一个区分两种体系结构的表达式,以便一个表达式使用正确的寄存器,而不管当前使用的体系结构如何?

1 个答案:

答案 0 :(得分:1)

lldb为在寄存器中传递值的体系结构提供了方便的寄存器名称 - 例如,arg0用于第一个参数。但是,标准的i386 ABI不会在寄存器中传递参数,它们会在堆栈上传递(假设可用的通用寄存器数量很少,这并不奇怪)。

eax(i386 ABI中的易失/非被调用者保存的reg)与objc_exception_throw的条目相关的值显示了Objective-C运行时({{1在其内部例程之间进行一些非标准函数调用,可能是为了提高效率。您无法使用其他模块中的非标准ABI来调用例程。

如果你在谈论两个在寄存器中传递参数的ABI,比如x86_64和arm,那么你可以使用lldb的libobjc便利变量。

如果在命令行中使用lldb,则可以编写一个获取arg0r0的python函数,具体取决于体系结构,并获取异常名称以确定断点是否应继续或不。但我不认为Xcode(今天)为您提供了一种方法,可以在断点上放置python命令并控制该进程是否恢复。