- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在使用 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/
这个问题在这里已经有了答案: Test whether a register is zero with CMP reg,0 vs OR reg,reg? (2 个回答) 3年前关闭。 or eax,e
test eax, eax 是否比 cmp eax, 0 更高效?是否存在需要 test eax, eax 而 cmp eax, 0 不满足要求的情况? 最佳答案 正如臧明杰在评论中已经说过的,tes
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: x86 Assembly - ‘testl’ eax against eax? 我对汇编语言编程非常陌生,我目前正在
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
GCC 给我做了一些汇编代码,里面有这个语句: lea eax, [ebx+eax] (英特尔语法) 只是好奇,这有什么区别,和: add eax, ebx 是? eax 和 ebx 包含函数的返回值
leal (%eax, %eax) 是什么意思做? %eax * 2 处的内容是否会相乘,因为它有括号? 最佳答案 它将使用 eax 的总和加载目标操作数和 eax , IOW, 2* eax . 关
我正在尝试理解一些汇编。 程序集如下,我对teSTL行感兴趣: 000319df 8b4508 movl 0x08(%ebp), %eax 000319e2 8b4004
LEA EAX, [EAX] 我在使用 Microsoft C 编译器编译的二进制文件中遇到了这条指令。它显然不能改变 EAX 的值。那它为什么在那里? 最佳答案 这是一个NOP。 以下通常用作NOP
我正在二进制文件中搜索特定指令,对于 xor eax,eax 指令,我有一个函数,如: int foo(){ return 0; } 如果我用 GCC 4.7.2 和 -O2 或 -O3 优化标志
我正在二进制文件中搜索特定指令,对于 xor eax,eax 指令,我有一个函数,如: int foo(){ return 0; } 如果我用 GCC 4.7.2 和 -O2 或 -O3 优化标志
什么是 0x01b55ee2 mov 0x40(%eax),%eax 是什么意思?我应该如何解释 0x40(),因为我的代码在该位置崩溃时遇到问题。 %eax寄存器的内容为0。 最佳答案
我知道 dword ptr 是一个 size 指令,它指示移动内容的大小,我知道 mov eax, eax 是一种 nop 代码形式,但这有什么作用? 我认为它将 eax 的地址与内部的十六进制值交换
这个问题已经有答案了: What is the meaning of MOV (%r11,%r12,1), %edx? (2 个回答) 已关闭 5 年前。 一直在从事 assembly 作业,并且在很
我在 GAS 源代码中定义了一个 MACRO。但是不是gcc编译的。 下面是我定义的MACRO。 #define MSGSCHEDULE0(index) \ movl (index*4)(%r
我在组装方面完全是个菜鸟,只是四处看看发生了什么。无论如何,我写了一个非常简单的函数: void multA(double *x,long size) { long i; for(i=0; i
GCC 4.4.3 生成了以下 x86_64 程序集。让我困惑的部分是 mov %eax,%eax .将寄存器移至自身?为什么? 23b6c: 31 c9
两条线有什么区别 push eax mov [esp], eax 不将 eax 压入堆栈(esp 所指向的位置与 mov [esp]、eax 一样?) 最佳答案 “push”会自动改变“esp”(你的
以下说明有何意义? xor eax,eax mov eax,[eax] 当您对 eax 进行 XOR 时,大多数情况下您会得到零,那么您可以取消引用地址 [eax] 中的内容(在本例中 eax 包含
我是一个初学者,正在编写汇编程序以使用以下代码打印从 1 到 9 的数字: section .text global _start _start:
Apparently ,现代处理器可以判断您是否做了一些愚蠢的事情,例如将寄存器移动到自身 ( mov %eax, %eax ) 并将其优化。为了验证该声明,我运行了以下程序: #include #
我是一名优秀的程序员,十分优秀!