いさぽん.COM「つくる」に挑戦中

ゲーム系プログラマによる特に方針のないブログ。技術系とカレー、ラーメンネタ多めだったはずが、最近はダイエットネタ多め。

Android NDK SIGSEGV(デバッグダンプ)からソースの位置を確認する

たまに忘れるのでメモ。

NDKで開発しているときに、何かしらの問題が発生してクラッシュすることがあります。 logcatを見ると以下のようなダウンデータが出力されます。

とりあえずこれをリダイレクトなり貼り付けるなりしてファイルに保存しておきます。ここでは仮に log.txt という名前で保存したとします。

Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1), thread xxxx (yyyyy
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: xxxxxxx
Revision: '0'
pid: xxxx, tid: 3955, name: xxxxx >>> xxxxxxxx <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000008
    r0 5f5b5700  r1 00000000  r2 5f5b55ec  r3 00000000
    r4 5f5b55d0  r5 5f5b7200  r6 5f5b55ec  r7 5f5b7200
    r8 5f5b56bc  r9 00000000  sl 5f6b5d48  fp 5f6b5d24
    ip 5f5a5d40  sp 5f6b5ce0  lr 5f447ff0  pc 5f4629cc  cpsr 800f0010
    d0  0000000000000000  d1  0000000000000000
    d2  2020202020202020  d3  2020202020202020
    d4  7247646e756f7267  d5  0a0a007974697661
    d6  756f726765726f66  d7  414000000700646e
    d8  0000000000000000  d9  0000000000000000
    d10 0000000000000000  d11 0000000000000000
    d12 0000000000000000  d13 0000000000000000
    d14 0000000000000000  d15 0000000000000000
    d16 0000000000000000  d17 0000000000000000

 ~~~中略~~~

code around lr:
    5f447fd0 e28db004 ebffebf9 e3a00000 e8bd8800  
    5f447fe0 e92d4800 e2800008 e28db004 ebffebf3  
    5f447ff0 e3a00000 e8bd8800 e92d4800 e2800008  
    5f448000 e28db004 ebffebf0 e3a00000 e8bd8800  
    5f448010 e92d4800 e2800008 e28db004 ebffebea  
    5f448020 e3a00000 e8bd8800 e92d4818 e1a04000  
    5f448030 e59f3020 e28db00c e79f3003 e2833008  
    5f448040 e4803008 ebffebe3 e1a00004 ebfff564  
    5f448050 e1a00004 e8bd8818 0015d868 e92d4818  
    5f448060 e1a04000 e59f3020 e28db00c e79f3003  
    5f448070 e2833008 e4803008 ebffebd6 e1a00004  
    5f448080 ebfff59c e1a00004 e8bd8818 0015d838  
    5f448090 e59f2020 e1a03000 e92d4800 e79f2002  
    5f4480a0 e28db004 e3a01000 e2800014 ebffebcc  
    5f4480b0 e3a00000 e8bd8800 0015d80c e92d4800  
    5f4480c0 e28db004 e24dd008 e24b1008 e5900014

ndk-stack

ndkに含まれる ndk-stack に先ほどのログファイルを食わせてあげます。その際に、シンボル情報が格納されているコンパイラの出力した中間ファイル(.o)のパスも指定しておきます。

$NDK_HOME/ndk-stack -sym $ANDROID_PROJ/obj/local/armeabi-v7a-hard -dump log.txt

(obj/local/armebi-v7a-hard はndk-buildでコンパイルした時にできた中間ファイルの場所を指定します。armeabiのところはスマホのCPUに合わせて書き換えてください)

これでソースコードのどこで落ちたのか調べることができます。