作業中の 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 コードにありますか? 両方を変更しようとしましたが、役に立ちませんでした。上記のアセンブリ コードはオリジナルです。
Github の完全なソースへのリンクを次に示します。Xcode を使用して iDevice でコンパイルして実行するだけで、私が直面している正確な問題が表示されます。その方法でデバッグする方が簡単かもしれません。