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

これは、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 でコンパイルして実行するだけで、私が直面している正確な問題が表示されます。その方法でデバッグする方が簡単かもしれません。

4

2 に答える 2

1

translation_cache_iphone最後の 2 つの命令は、実行可能コードであると予想されるへの間接的なジャンプを形成します。そうであり、メモリのアクセス許可が適切であることを確認します。多くのシステムでは、データ ページはデフォルトでは実行可能ではありません。

于 2012-12-03T00:54:53.803 に答える
1

これは、translation_cache_iphone 変数がクラッシュの原因であるという私の考えを支持しているようです

はい、この変数が問題だと思います。

あなたが投稿したアセンブリ コードでは、メモリへの無効なアクセスを引き起こす可能性のある 1 行を確認できます。それは次のとおりです。

ldr r0, 42430b
ldr pc, [r0]

最初の行は、ラベル 42430 からレジスタ r0 にデータをロードします。次に、2 行目は PC (プログラム カウンター) を r0 の内容にポイントします。

アセンブリ コードの先頭で、ラベル 42430 を宣言しました。

42430:
  .long _translation_cache_iphone

次に、この値にアクセスしてコードとして実行しようとすると、クラッシュします。

于 2012-12-03T00:56:21.197 に答える