2012-02-29 7 views
0

私のアプリケーションでネイティブクラッシュを探していますが、私はこの記事を見た私のライブラリの関数名にアドレスを変換するのに役立つツールを見つけることができません:あなたが最後の3行に見ることができるようスタックトレースを取得する方法androidのC++関数名

I/DEBUG ( 31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 
I/DEBUG ( 31): Build fingerprint: 'generic/sdk/generic:2.3/GRH55/79397:eng/test-keys' 
I/DEBUG ( 31): pid: 378, tid: 386 >>> com.example.gltest <<< 
I/DEBUG ( 31): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 
I/DEBUG ( 31): r0 001dbdc0 r1 00000001 r2 00000000 r3 00000000 
I/DEBUG ( 31): r4 00000000 r5 40a40000 r6 4051a480 r7 42ddbee8 
I/DEBUG ( 31): r8 43661b24 r9 42ddbed0 10 42ddbebc fp 41e462d8 
I/DEBUG ( 31): ip 00000001 sp 436619d0 lr 83a12f5d pc 8383deb4 cpsr 20000010 
I/DEBUG ( 31):   #00 pc 0003deb4 /data/data/com.example.gltest/lib/libnativemaprender.so 
I/DEBUG ( 31):   #01 pc 00039b76 /data/data/com.example.gltest/lib/libnativemaprender.so 
I/DEBUG ( 31):   #02 pc 00017d34 /system/lib/libdvm.so 

アプリケーションのライブラリがあります:あなたがこのような跡がある場合のみに機能しているようです

ibnativemaprender.soと場合にのみ、あなたのライブラリが表示されますaddr2lineアプリが動作します

が、私のトレースに私はこれがあります。

I/DEBUG (16251):   #00 pc 000161c0 /system/lib/libc.so 
I/DEBUG (16251):   #01 lr afd196f1 /system/lib/libc.so 

を、私のライブラリが後になるまでそこに表示されていません。

/DEBUG (16251): stack: 
I/DEBUG (16251):  46f0c818 afd426a4  
I/DEBUG (16251):  46f0c81c 000b7290  
I/DEBUG (16251):  46f0c820 00000afa  
I/DEBUG (16251):  46f0c824 afd187b9 /system/lib/libc.so  
I/DEBUG (16251):  46f0c828 afd42644  
I/DEBUG (16251):  46f0c82c afd467c4  
I/DEBUG (16251):  46f0c830 00000000  
I/DEBUG (16251):  46f0c834 afd196f1 /system/lib/libc.so 
I/DEBUG (16251):  46f0c838 00000001  
I/DEBUG (16251):  46f0c83c 46f0c86c  
I/DEBUG (16251):  46f0c840 81b6a4a0 /data/data/com.android.ANMP/lib/mylib.so 

ので、私を助けることができるツールはありますか?またはaddr2lineを使用する別の方法は?

答えて

1

いいえ、実際はありません。これを行うには、手動で検索を実行する必要があります。

  • はあなたのライブラリーをロードし、いつどこで、それは(非常に高価なツールです)

  • 使用IDA Proを、たまたま見つけるためにデバッグプリントを追加します。

    手動で、3つのオプションがありますそれにアドレス81b6a4a0を探して、それがどの機能であるか把握してみてください。デバッグシンボルを使用してコンパイルする場合は、十分に簡単でなければなりません。

  • ライブラリのベースアドレスを検索し、objdump(NDKツールチェーンから)を使用して、アドレス81b6a4a0(そのベースアドレスを削除した後)にあるものを探します。あなたは、役に立つ何かを見つけるADBを使用してデバイスから libdvm.so libc.so を引くと機能が表示されることをしているものを見つけるためにしようとしない場合は、両方の最後の方法で

、スタックトレースでは、コード内でそれらの関数をどこで呼び出すかを確認します。

+0

を、あなたは手動で情報私はすべての方法に出入りするたびに印刷するように意味?検索とはどういう意味ですか? – elios264

+0

私は私の答えを編集します。 – MByD

+0

ndk-stackツールはどれくらい便利ですか? – MobileCushion

0

thisをご覧ください。私はまだ試してみる時間を見つけていないので、あなたのために働いた場合は教えてください

0

スタックトレースを得るためにGDBを使用することができます。根っこの電話がある場合やエミュレータを使用している場合は、コアダンプを有効にすることができます。次に、GDBを使ってコアダンプを調べることができます。

EclipseでGDBを設定するため、この質問を参照してください:

android how to use ndk gdb with a pure native executable

関連する問題