1

我正在尝试在我正在开发的 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 上编译和运行,您就会看到我面临的确切问题。这样调试可能更容易。

4

2 回答 2

1

最后两条指令形成一个间接跳转,translation_cache_iphone因此预期是可执行代码。验证是这种情况以及内存权限是否合适——在许多系统中,数据页默认情况下是不可执行的。

于 2012-12-03T00:54:53.803 回答
1

这似乎支持我的想法,即导致崩溃的是 translation_cache_iphone 变量

是的,我相信这个变量是问题所在。

在您发布的汇编代码中,我可以看到一行可能导致对内存的无效访问,它是:

ldr r0, 42430b
ldr pc, [r0]

第一行将数据从标签 42430 加载到寄存器 r0。然后,第二行将 PC(程序计数器)指向 r0 的内容。

在汇编代码的开头,您已声明标签 42430 是什么:

42430:
  .long _translation_cache_iphone

然后,当它尝试访问该值并以代码形式执行时,它会崩溃。

于 2012-12-03T00:56:21.197 回答