gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:01 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于ios - 区分 LLDB 中的 iOS 模拟器和设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14372056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com