我正在尝试在我正在开发的 iOS 应用程序中调试 EXC_BAD_ACCESS 崩溃。基本上,我的代码调用了对应于某个汇编方法的函数 new_dyna_start()。这是相关的汇编代码:
.align 4
42430:
.long _translation_cache_iphone
.align 2
.globl _new_dyna_start
// .type new_dyna_start, %function
_new_dyna_start:
ldr r12, .dlptr
mov r0, #0xa4000000
stmia r12, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
sub fp, r12, #28
add r0, r0, #0x40
bl _new_recompile_block
ldr r0, [fp, #64]
ldr r10, [fp, #400+36] /* Count */
str r0, [fp, #72]
sub r10, r10, r0
ldr r0, 42430b
ldr pc, [r0]
根据我的(有限)理解,在该方法的第 6 行,它调用了 C 函数 new_recompile_block()。这个方法工作得很好,我知道它完成了,因为在函数结束时我有
printf("End of loop");
然后出现在调试器中。方法完成后,我不完全确定我理解发生了什么,但似乎汇编方法获得了对 C 变量 translation_cache_iphone 的引用。然而,在最后一行应用程序奇怪地崩溃了。此消息出现在 Xcode 中:http: //imgur.com/dqKo0
但是,如果我单击最后一个调用方法的一侧,我看到它是这样的:http: //imgur.com/M5h84
这似乎支持我的想法,它是导致崩溃的 translation_cache_iphone 变量,因为 EXC_BAD_ACCESS (0x401000) 的内存地址与 translation_cache_iphone 相同。translation_cache_iphone 被声明为:
unsigned char* translation_cache_iphone = NULL;
并由以下方式初始化:
translation_cache_iphone = (unsigned char *)(((unsigned long) translation_cache_static_iphone + (4096)) & ~(4095));
我是否正确地假设这是问题所在?问题出在汇编代码中还是 C 代码中?我已经尝试修改两者,但无济于事。上面的汇编代码是原始的。
这是Github 上完整源代码的链接。只需使用 Xcode 在 iDevice 上编译和运行,您就会看到我面临的确切问题。这样调试可能更容易。