簡體   English   中英

iOS 應用程序匯編代碼中的 EXC_BAD_ACCESS

[英]EXC_BAD_ACCESS in Assembly Code in iOS App

我正在嘗試調試我正在處理的 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 上編譯和運行,您就會看到我面臨的確切問題。 以這種方式調試可能更容易。

最后兩條指令形成了到translation_cache_iphone的間接跳轉,因此預計它是可執行代碼。 驗證情況是否如此,以及內存權限是否合適 - 在許多系統中,默認情況下數據頁是不可執行的。

這似乎支持我的想法,它是導致崩潰的 translation_cache_iphone 變量

是的,我相信這個變量是問題所在。

在您發布的匯編代碼中,我可以看到一行可能導致對內存的無效訪問,它是:

ldr r0, 42430b
ldr pc, [r0]

第一行將數據從標簽 42430 加載到寄存器 r0。 然后,第二行將 PC(程序計數器)指向 r0 的內容。

在匯編代碼的開頭,您已經聲明了標簽 42430 是什么:

42430:
  .long _translation_cache_iphone

然后,當它嘗試訪問此值並作為代碼執行時,它崩潰了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM