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に合わせて書き換えてください)
これでソースコードのどこで落ちたのか調べることができます。