【问题标题】:Differentiating between the iOS Simulator and Device in LLDB在 LLDB 中区分 iOS 模拟器和设备
【发布时间】:2012-12-31 13:51:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios xcode breakpoints lldb


    【解决方案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 函数,根据架构获取r0eax,并获取异常名称来决定断点是否应该继续。但我不认为 Xcode(今天)为您提供了一种将 python 命令置于断点上并控制进程是否恢复的方法。

    【讨论】:

    • 您将如何在 Python 脚本中执行此操作?我假设有一种方法可以在 Xcode 中运行的 LLDB 中自动加载 Python 代码,并且断点可以在 LLDB 中运行任意命令。有可能您可以直接在 LLDB 命令中将条件直接移动到 Python 代码中,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 2012-05-17
    • 2012-07-24
    • 2019-01-10
    • 2012-10-26
    • 2013-05-24
    相关资源
    最近更新 更多