gpt4 book ai didi

ios - X代码/LLDB : po $eax and po $r0 only display ints for __cxa_throw exceptions?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:31 27 4
gpt4 key购买 nike

在使用 LLDB 研究调试异常时,我发现了以下文章和线程,以及其他提供相同信息的文章:

https://www.natashatherobot.com/xcode-debugging-trick/

Xcode/LLDB: How to get information about an exception that was just thrown?

当尝试这些的变体时,我能得到的最好结果是一个 int:

(lldb) po $rax

106377751137688

当将它插入 Xcode 内存查看器时,尝试将其作为 base-10 和 hex 值,似乎没有对象存储在那里。我得到诸如 B8 0B 0C 16 01 00 00 00 03... 之类的结果,然后是眼睛所能看到的零。我试过在 int 上调用 description 之类的方法,就好像它是一个地址一样,将其转换为 NSException*,结果如下:

error: Execution was interrupted, reason: Attempted to dereference an invalid ObjC Object or send it an unrecognized selector. The process has been returned to the state before expression evaluation.

最近是否对 LLDB 进行了更改会破坏预期的功能?我正在使用 Xcode 9.2 以及 swift 和 objective-c 的组合。可能还值得注意的是,我没有在调用堆栈中看到帧 objc_exception_throw,而是在帧 0 处看到 __cxa_throw,这是我选择获取结果的帧.

我正在查看的异常是由对 -[UIStoryboard instantiateViewControllerWithIdentifier:]

的调用生成的

编辑:如果我手动创建一个 NSException 和 @throw 它,我可以用 po $rax 查看它。我注意到在这种情况下,调用堆栈的第 0 帧是 objc_exception_throw。我编辑了标题以指定我要询问的异常类型。

最佳答案

ObjC异常的正常过程是系统调用传入异常对象的objc_exception_throw来启动异常。但在幕后,ObjC 使用与 C++ 相同的异常抛出机制来实现堆栈的实际展开。所以 objc_exception_throw 将转身调用 __cxa_throw - 这也恰好是 C++ 异常起点。

当 ObjC 执行此操作时,在 __cxa_throw 处抛出的对象(恰好是它的第一个参数)是一个 ObjC 对象。但是系统的某些部分有时会抛出真正的 C++ 异常。如果您在 __cxa_throw 中停止而没有首先在 objc_exception_throw 中停止,那将是一个 C++ 异常对象而不是 NSException,并且 po 不会为它们做任何事情。

顺便说一句,当你在 __cxa_throw 中停止时,堆栈还没有展开,所以如果你好奇的话,回溯应该会告诉你是谁在抛出异常。

总之,如果您只想查看 ObjC 异常,请不要停在 __cxa_throw,只需停在 objc_exception_throw。在 __cxa_throw 处停止不会添加任何信息,并且会导致您必须从您关心的 ObjC 异常中区分出虚假的纯 C++ 异常。

在 Xcode 中,您可以通过选择 ObjC 异常断点而不是“所有异常”来执行此操作。在命令行 lldb 中,执行此操作:

(lldb) break set -E objc

关于ios - X代码/LLDB : po $eax and po $r0 only display ints for __cxa_throw exceptions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48331813/

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