3

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

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

是否可以制作一个区分两种架构的表达式,以便一个表达式使用正确的寄存器,而不管当前使用的架构如何?

4

1 回答 1

1

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

eax(i386 ABI 中的 volatile/non-callee-saved reg)在进入时具有相关值的事实objc_exception_throw表明 Objective-C 运行时 ( libobjc) 在其内部例程之间进行了一些非标准函数调用,可能是效率。您不能使用像这样的非标准 ABI 从另一个模块调用例程。

如果您谈论的是两个在寄存器中传递参数的 ABI,例如 x86_64 和 arm,那么您可以使用 lldb 的arg0便捷变量。

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

于 2013-01-17T04:39:46.313 回答