我正在尝试在我正在处理的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
这似乎支持我的想法,因为EXC_BAD_ACCESS(0x401000)的内存地址与translation_cache_iphone相同,因此它是导致崩溃的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代码中的问题?我试过修改两者,但无济于事。上面的汇编代码是原始代码。
Here is a link到Github上的完整源代码。只需在带有Xcode的iDevice上编译和运行,您就会看到我面临的确切问题。以这种方式调试可能更容易。
答案 0 :(得分:1)
最后两条指令形成了对translation_cache_iphone
的间接跳转,因此预期它是可执行代码。验证是否是这种情况并且内存权限是合适的 - 在许多系统中,默认情况下数据页不可执行。
答案 1 :(得分:1)
这似乎支持了我的想法,即导致崩溃的translation_cache_iphone变量
是的,我相信这个变量就是问题。
在您发布的汇编代码中,我可以看到一行可能导致对内存的无效访问,它是:
ldr r0, 42430b
ldr pc, [r0]
第一行将数据从标签42430加载到寄存器r0。然后,第二行将PC(程序计数器)指向r0的内容。
在汇编代码的开头,您已经声明了标签42430:
42430:
.long _translation_cache_iphone
然后,当它尝试访问此值并执行为代码时,它会崩溃。