横浜 Android プラットフォーム部
                 第 27 回勉強会



Android のデバッグ小ネタ


                  2012/12/22
                     @l_b__
リブートバグ
●
    端末のリブート、困りますよね
●
    リブートの原因は HW のこともあるけれど、
     大抵 SW
●
    SW 要因の場合、大きな原因は 2 つでした
リブート要因
●
    フレームワーク部分処理で無限ループ / デッ
     ドロックで処理が止まり、 Watchdog から
     リブート
●
    Init で起動される System 権限のサーバ類が例
      外で落ちてリブート
Watchdog からリブート
●
    どこで処理が止まっているかを探しましょう
●
    ANR を出していることが多いので、その辺り
     の時刻のログを取得
●
    bugreport を出力してチェック
bugreport
●
    端末内の様々な状態をまとめて取得するコマンド
●
    # adb bugreport で標準出力に出力される
      –   リダイレクトしてファイルに保存しましょう
●
    内部処理として、 dumpstate サービスに接続して、情
     報を取得
●
    JelleyBean ではソースは
      –   bugreport   frameworks/base/cmds/bugreport
      –   dumpstate   frameworks/native/cmds/dumpstate
bugreport はどんな情報が ?
●
    カーネルから取得した CPU やメモリの情報
●
    ログ (main/events/system/radio) を一通り
●
    ANR のトレース
●
    ネットワークの情報
●
    システム設定 DB の内容
●
    システムプロパティ
●
    ファイルシステムの状態
●
    パッケージの情報
●
    Binder の情報
●
    Framework サービスの情報
●
    実行中アプリのアクティビティ、サービス、プロバイダの情報
問題箇所を探すには ?
●
    VM TRACES JUST NOW の箇所を確認しま
     しょう
●
    Bugreport 実行時や ANR 発生した時の VM ス
     タックトレースを出力
●
    問題が発生していた時の実行メソッドを特定
     できる
VM TRACES JUST NOW
●
    ------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2012-08-26 06:35:25) ------
●
    ----- pid 124 at 2012-08-26 06:35:23 -----
●
    Cmd line: /system/bin/surfaceflinger
●
    "surfaceflinger" sysTid=124
●
     #00 pc 0000cb60 /system/lib/libc.so (__ioctl+8)
●
     #01 pc 00027f95 /system/lib/libc.so (ioctl+16)
●
     #02 pc 00016bfd /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool)
       +124)
●
     #03 pc 000173af /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)
       +154)
●
     #04 pc 000007ed /system/bin/surfaceflinger
VM TRACES JUST NOW
●
    ----- pid 25855 at 2012-08-26 06:35:25 -----

●
    Cmd line: jp.r246.twicca

●
    "AsyncTask #5" prio=5 tid=15 WAIT

●
     | group="main" sCount=1 dsCount=0 obj=0x41d56710 self=0x662a45e0

●
     | sysTid=25883 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1714047536

●
     | schedstat=( 686456000 421807000 1632 ) utm=58 stm=10 core=0


●
     at java.lang.Object.wait(Native Method)

●
     - waiting on <0x41d44670> (a java.lang.VMThread) held by tid=15 (AsyncTask #5)

●
     at java.lang.Thread.parkFor(Thread.java:1231)

●
     at sun.misc.Unsafe.park(Unsafe.java:323)

●
     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)

●
     at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2022)

●
     at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413)

●
     at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1009)

●
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1069)

●
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)

●
     at java.lang.Thread.run(Thread.java:856)
問題箇所を探すには ?
●
    赤丸の箇所がダンプ取得時のプロセスが実行
     していたメソッド
●
    想定される処理待ち以外で止まっているプロ
     セスがないかをチェック
例外でリブート
●
    logcat で例外発生時のスタックトレースを確
      認
●
    Java の場合は素直にスタックトレースを見れ
      ば大体分かります
●
    Native の場合は ...
Native Stacktrace の例
●
    *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

●
    Build fingerprint: ‘generic/myboard_xxx/xxx/myplatform:2.1/ERD79/eng.arunks.20100726.14330

●
    8:eng/test-keys’

●
    pid: 1138, tid: 1138 >>> /system/bin/bluetoothd <<<

●
    signal 11 (SIGSEGV), fault addr deadbaad

●
    r0 00000000 r1 afe13369 r2 00000027 r3 00000054

●
    r4 afe3ae08 r5 00000000 r6 00000000 r7 0000a000

●
    r8 00000000 r9 00000000 10 00000000 fp 00000000

●
    ip 00002ed8 sp bec782d8 lr deadbaad pc afe10a20 cpsr 60000030

●
    #00 pc 00010a20 /system/lib/libc.so

●
    #01 pc 0000b332 /system/lib/libc.so

●
    #02 pc 0000ca62 /system/lib/bluez-plugin/audio.so

●
    #03 pc 0000d1ce /system/lib/bluez-plugin/audio.so

●
    #04 pc 0000e0ba /system/lib/bluez-plugin/audio.so
Native Stacktrace の例
●
    #05 pc 0002f9a2 /system/lib/libbluetoothd.so

●
    #06 pc 00026806 /system/lib/libbluetoothd.so

●
    #07 pc 00026986 /system/lib/libbluetoothd.so

●
    #08 pc 0002800c /system/lib/libbluetoothd.so

●
    #09 pc 00028b72 /system/lib/libbluetoothd.so

●
    #10 pc 0001891a /system/lib/libbluetoothd.so

●
    #11 pc 0000c228 /system/lib/libc.so

●
    code around pc:

●
    afe10a10 f8442001 4798000c e054f8df 26002227

●
    afe10a20 2000f88e ef2cf7fb f7fd2106 f04fe80a

●
    afe10a30 91035180 460aa901 96012006 f7fc9602

●
    code around lr:

●
    ...
発生箇所を特定する
●
    #00 pc 00010a20 /system/lib/libc.so
    の箇所から、 libc.so の 0x00010a20 にて
     signal 11 (SIGSEGV), fault addr deadbaad
    が発生していることが分かります
発生箇所を特定する
●
    addr2line でどの関数で発生しているかを
     チェック
●
    JellyBean の場合、
      –   prebuilts/gcc/linux-x86/arm/arm-eabi-
           4.6/bin/arm-eabi-addr2line
発生箇所を特定する
●
    arm-eabi-addr2line -f -e (path to libc.so)
      0x00010a20
●
    これで発生関数が特定できます
●
    out/target/product/(Board name)/symbols 以
     下のデバッグシンボル付きライブラリを指
     定すれば発生行まで特定できます
●
    後はスタックを上にたどれば作成した箇所の
     どこで問題が発生しているか特定できます
まとめ
●
    ログが取れれば以上の方法で原因追跡できま
     す
●
    大体リブートバグの 9 割くらいはこれで追え
     るかな
●
    一番難しいのはバグを再現してログを取るこ
     とです


                        以上

More Related Content

PDF
Android起動周りのノウハウ
PDF
ネットワーク構築訓練 入門
PDF
目grep入門 +解説
PDF
Booting Android: bootloaders, fastboot and boot images
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
例外設計における大罪
PDF
きつねさんでもわかるLlvm読書会 第2回
PDF
Androidの新ビルドシステム
Android起動周りのノウハウ
ネットワーク構築訓練 入門
目grep入門 +解説
Booting Android: bootloaders, fastboot and boot images
怖くないSpring Bootのオートコンフィグレーション
例外設計における大罪
きつねさんでもわかるLlvm読書会 第2回
Androidの新ビルドシステム

What's hot (20)

PDF
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
PDF
Spring 5でSpring Testのここが変わる_公開版
PDF
入社1年目のプログラミング初心者がSpringを学ぶための手引き
PDF
オブジェクト指向プログラミングの現在・過去・未来
PDF
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
PDF
15. Transformerを用いた言語処理技術の発展.pdf
PDF
ARM Trusted FirmwareのBL31を単体で使う!
PDF
今さら聞けないDiとspring
PDF
デプロイメントパイプラインって何?
PDF
Open Liberty: オープンソースになったWebSphere Liberty
PDF
新入社員のための大規模ゲーム開発入門 サーバサイド編
PDF
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
PDF
10分で分かるデータストレージ
PDF
継承やめろマジやめろ。 なぜイケないのか 解説する
PDF
レシピの作り方入門
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
initramfsについて
PDF
Android BLEのつらみを予防するTips
PDF
イマドキ!ユースケース別に見るAWS IoT への接続パターン
PDF
JPAのキャッシュを使ったアプリケーション高速化手法
Spring Bootハンズオン ~Spring Bootで作る マイクロサービスアーキテクチャ! #jjug_ccc #ccc_r53
Spring 5でSpring Testのここが変わる_公開版
入社1年目のプログラミング初心者がSpringを学ぶための手引き
オブジェクト指向プログラミングの現在・過去・未来
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
15. Transformerを用いた言語処理技術の発展.pdf
ARM Trusted FirmwareのBL31を単体で使う!
今さら聞けないDiとspring
デプロイメントパイプラインって何?
Open Liberty: オープンソースになったWebSphere Liberty
新入社員のための大規模ゲーム開発入門 サーバサイド編
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
10分で分かるデータストレージ
継承やめろマジやめろ。 なぜイケないのか 解説する
レシピの作り方入門
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
initramfsについて
Android BLEのつらみを予防するTips
イマドキ!ユースケース別に見るAWS IoT への接続パターン
JPAのキャッシュを使ったアプリケーション高速化手法
Ad

Viewers also liked (20)

PDF
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
PDF
Android,Brillo,ChromeOS
ODP
Stagefright入門
ODP
Yapf2013
PDF
Open binder
PDF
Eclipseを使ったandroid nativeデバッグ
PDF
JellyBeanのソースをとりあえず眺めてみた(手抜き)
PDF
ABS2015 のセッション紹介
PDF
PF開発に使えるAOSPのツール達
PDF
Stagefright入門
PDF
Binderのはじめの一歩とAndroid
ODP
Intentの概要
PPTX
20150909 日本androidの会9月定例講演資料
PDF
Interactive UI with UniRx
PDF
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
PPTX
若輩エンジニアから見たUniRxを利用したゲーム開発
PDF
UNITY5の地味だけど現場で 役に立つ新機能紹介 & 拡充されるクラウドサービス
PDF
ADB(Android Debug Bridge): How it works?
PDF
Unity scene file collaboration
ODP
Unity ネイティブプラグインの作成について
(Unityよくわかってない人のための)なんとなくわかるかもしれないAssetBundle
Android,Brillo,ChromeOS
Stagefright入門
Yapf2013
Open binder
Eclipseを使ったandroid nativeデバッグ
JellyBeanのソースをとりあえず眺めてみた(手抜き)
ABS2015 のセッション紹介
PF開発に使えるAOSPのツール達
Stagefright入門
Binderのはじめの一歩とAndroid
Intentの概要
20150909 日本androidの会9月定例講演資料
Interactive UI with UniRx
「ずいぶんとダサいライティングを使っているのね」〜UniRxを用いた物理ベースライティング制御〜
若輩エンジニアから見たUniRxを利用したゲーム開発
UNITY5の地味だけど現場で 役に立つ新機能紹介 & 拡充されるクラウドサービス
ADB(Android Debug Bridge): How it works?
Unity scene file collaboration
Unity ネイティブプラグインの作成について
Ad

Similar to Android デバッグ小ネタ (20)

PDF
Cybozu Tech Conference 2016 バグの調べ方
PDF
C/C++プログラマのための開発ツール
PDF
Dive into RTS - another side
KEY
SEAndroid -AndroidのアーキテクチャとSE化について-
PDF
Outsmarting Smartphone Apps 2
PDF
StackExchangeで見たシステムプログラミング案件
PDF
Programming camp 2010 debug hacks
PPTX
Serviceability Toolsの裏側
PDF
Debug Hacks at Security and Programming camp 2011
PPTX
Java 9で進化する診断ツール
PDF
Outsmarting Smartphone Apps 2
PPTX
iPhoneのデバッグハック
PDF
Let's play with Goldfish
PDF
FridaによるAndroidアプリの動的解析とフッキングの基礎
PDF
Di shen pacsec_jp-final
PDF
ソフトウェア工学2023 10 デバッグ
PPTX
Infer:人工知能を使った静的コードチェック
PDF
Inside Android Security
PPTX
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
PDF
How security broken? - Androidの内部構造とマルウェア感染の可能性
Cybozu Tech Conference 2016 バグの調べ方
C/C++プログラマのための開発ツール
Dive into RTS - another side
SEAndroid -AndroidのアーキテクチャとSE化について-
Outsmarting Smartphone Apps 2
StackExchangeで見たシステムプログラミング案件
Programming camp 2010 debug hacks
Serviceability Toolsの裏側
Debug Hacks at Security and Programming camp 2011
Java 9で進化する診断ツール
Outsmarting Smartphone Apps 2
iPhoneのデバッグハック
Let's play with Goldfish
FridaによるAndroidアプリの動的解析とフッキングの基礎
Di shen pacsec_jp-final
ソフトウェア工学2023 10 デバッグ
Infer:人工知能を使った静的コードチェック
Inside Android Security
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
How security broken? - Androidの内部構造とマルウェア感染の可能性

Android デバッグ小ネタ

  • 1. 横浜 Android プラットフォーム部 第 27 回勉強会 Android のデバッグ小ネタ 2012/12/22 @l_b__
  • 2. リブートバグ ● 端末のリブート、困りますよね ● リブートの原因は HW のこともあるけれど、 大抵 SW ● SW 要因の場合、大きな原因は 2 つでした
  • 3. リブート要因 ● フレームワーク部分処理で無限ループ / デッ ドロックで処理が止まり、 Watchdog から リブート ● Init で起動される System 権限のサーバ類が例 外で落ちてリブート
  • 4. Watchdog からリブート ● どこで処理が止まっているかを探しましょう ● ANR を出していることが多いので、その辺り の時刻のログを取得 ● bugreport を出力してチェック
  • 5. bugreport ● 端末内の様々な状態をまとめて取得するコマンド ● # adb bugreport で標準出力に出力される – リダイレクトしてファイルに保存しましょう ● 内部処理として、 dumpstate サービスに接続して、情 報を取得 ● JelleyBean ではソースは – bugreport   frameworks/base/cmds/bugreport – dumpstate   frameworks/native/cmds/dumpstate
  • 6. bugreport はどんな情報が ? ● カーネルから取得した CPU やメモリの情報 ● ログ (main/events/system/radio) を一通り ● ANR のトレース ● ネットワークの情報 ● システム設定 DB の内容 ● システムプロパティ ● ファイルシステムの状態 ● パッケージの情報 ● Binder の情報 ● Framework サービスの情報 ● 実行中アプリのアクティビティ、サービス、プロバイダの情報
  • 7. 問題箇所を探すには ? ● VM TRACES JUST NOW の箇所を確認しま しょう ● Bugreport 実行時や ANR 発生した時の VM ス タックトレースを出力 ● 問題が発生していた時の実行メソッドを特定 できる
  • 8. VM TRACES JUST NOW ● ------ VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2012-08-26 06:35:25) ------ ● ----- pid 124 at 2012-08-26 06:35:23 ----- ● Cmd line: /system/bin/surfaceflinger ● "surfaceflinger" sysTid=124 ● #00 pc 0000cb60 /system/lib/libc.so (__ioctl+8) ● #01 pc 00027f95 /system/lib/libc.so (ioctl+16) ● #02 pc 00016bfd /system/lib/libbinder.so (android::IPCThreadState::talkWithDriver(bool) +124) ● #03 pc 000173af /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool) +154) ● #04 pc 000007ed /system/bin/surfaceflinger
  • 9. VM TRACES JUST NOW ● ----- pid 25855 at 2012-08-26 06:35:25 ----- ● Cmd line: jp.r246.twicca ● "AsyncTask #5" prio=5 tid=15 WAIT ● | group="main" sCount=1 dsCount=0 obj=0x41d56710 self=0x662a45e0 ● | sysTid=25883 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1714047536 ● | schedstat=( 686456000 421807000 1632 ) utm=58 stm=10 core=0 ● at java.lang.Object.wait(Native Method) ● - waiting on <0x41d44670> (a java.lang.VMThread) held by tid=15 (AsyncTask #5) ● at java.lang.Thread.parkFor(Thread.java:1231) ● at sun.misc.Unsafe.park(Unsafe.java:323) ● at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157) ● at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2022) ● at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:413) ● at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1009) ● at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1069) ● at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) ● at java.lang.Thread.run(Thread.java:856)
  • 10. 問題箇所を探すには ? ● 赤丸の箇所がダンプ取得時のプロセスが実行 していたメソッド ● 想定される処理待ち以外で止まっているプロ セスがないかをチェック
  • 11. 例外でリブート ● logcat で例外発生時のスタックトレースを確 認 ● Java の場合は素直にスタックトレースを見れ ば大体分かります ● Native の場合は ...
  • 12. Native Stacktrace の例 ● *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ● Build fingerprint: ‘generic/myboard_xxx/xxx/myplatform:2.1/ERD79/eng.arunks.20100726.14330 ● 8:eng/test-keys’ ● pid: 1138, tid: 1138 >>> /system/bin/bluetoothd <<< ● signal 11 (SIGSEGV), fault addr deadbaad ● r0 00000000 r1 afe13369 r2 00000027 r3 00000054 ● r4 afe3ae08 r5 00000000 r6 00000000 r7 0000a000 ● r8 00000000 r9 00000000 10 00000000 fp 00000000 ● ip 00002ed8 sp bec782d8 lr deadbaad pc afe10a20 cpsr 60000030 ● #00 pc 00010a20 /system/lib/libc.so ● #01 pc 0000b332 /system/lib/libc.so ● #02 pc 0000ca62 /system/lib/bluez-plugin/audio.so ● #03 pc 0000d1ce /system/lib/bluez-plugin/audio.so ● #04 pc 0000e0ba /system/lib/bluez-plugin/audio.so
  • 13. Native Stacktrace の例 ● #05 pc 0002f9a2 /system/lib/libbluetoothd.so ● #06 pc 00026806 /system/lib/libbluetoothd.so ● #07 pc 00026986 /system/lib/libbluetoothd.so ● #08 pc 0002800c /system/lib/libbluetoothd.so ● #09 pc 00028b72 /system/lib/libbluetoothd.so ● #10 pc 0001891a /system/lib/libbluetoothd.so ● #11 pc 0000c228 /system/lib/libc.so ● code around pc: ● afe10a10 f8442001 4798000c e054f8df 26002227 ● afe10a20 2000f88e ef2cf7fb f7fd2106 f04fe80a ● afe10a30 91035180 460aa901 96012006 f7fc9602 ● code around lr: ● ...
  • 14. 発生箇所を特定する ● #00 pc 00010a20 /system/lib/libc.so の箇所から、 libc.so の 0x00010a20 にて signal 11 (SIGSEGV), fault addr deadbaad が発生していることが分かります
  • 15. 発生箇所を特定する ● addr2line でどの関数で発生しているかを チェック ● JellyBean の場合、 – prebuilts/gcc/linux-x86/arm/arm-eabi- 4.6/bin/arm-eabi-addr2line
  • 16. 発生箇所を特定する ● arm-eabi-addr2line -f -e (path to libc.so) 0x00010a20 ● これで発生関数が特定できます ● out/target/product/(Board name)/symbols 以 下のデバッグシンボル付きライブラリを指 定すれば発生行まで特定できます ● 後はスタックを上にたどれば作成した箇所の どこで問題が発生しているか特定できます
  • 17. まとめ ● ログが取れれば以上の方法で原因追跡できま す ● 大体リブートバグの 9 割くらいはこれで追え るかな ● 一番難しいのはバグを再現してログを取るこ とです 以上