Androidでaddr2lineを使用する方法
2023-08-17 12:16:28
質問
私のアプリはマルチスレッドであり、SIGSEGV エラーでクラッシュするため、デバッグすることができず、行き詰っています。私は LogCat から多くの情報を得ますが、それは私のネイティブ ライブラリのアドレスを教えてくれます。私がこれらのアドレスを私のコードに変換することができれば、それは有用です。
android-ndkで提供されているaddr2lineの使い方をご存知の方はいらっしゃいませんか?
どのように解決するのですか?
logcatが次のようなクラッシュログを表示したとしましょう(これは私のプロジェクトの1つからのものです)。
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
最後の3行を見てください。これがあなたのコールスタックです。pc' はプログラムカウンタで、スタックフレーム#00 の pc はクラッシュが発生したアドレスを示しています。これは addr2line に渡される番号です。
私は NDK r5 を使っているので、私が使っている実行ファイルは
$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin
にあることを確認してください。
$PATH
. 使用するコマンドは次のようになります。
arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>
あるいは、上のような場合
arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libnativemaprender.so 0003deb4
これでクラッシュの位置がわかる。
注意してください。
- C フラグは、C++ コードを分離するためのものです。
- の下にある .so ファイルを使用します。 obj/local/armeabiにある.soファイルを使用してください。 ストリップされていないバージョン
また、2.3 AVD で NDK r5 を使用する場合、マルチスレッド コードをデバッグすることが実際に可能です。
関連
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み] Androidで画面の大きさをピクセル単位で取得する方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み] アンドロイドのクライアントでヒープアップデートを有効にする方法
-
[解決済み] キャンバスに複数行のテキストを描画する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] Android Debug Bridgeでアプリケーションのインストール時にINSTALL_FAILED_VERSION_DOWNGRADEを無視する方法はありますか?
-
[解決済み] HttpPostによる画像送信
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 文字サイズとアンドロイドの画面サイズの違い
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] グリッドビューの高さが削減される
-
[解決済み] WhatsAppでメッセージを送信する
-
[解決済み] <string> XMLで改行やタブを作るには(eclipse/android)?