web-dev-qa-db-ja.com

AndroidでSIGSEGVの理由を理解する方法

Androidアプリがクラッシュし、クラッシュがネイティブコードで発生するため、スタックトレースが生成されないという報告が増えています。ネイティブ関数は1つしかありません。起動時に1回呼び出され、2〜3分後に問題が発生するためです。

Logcatから次の部分的なダンプを取得しました。

I/DEBUG   ( 8704): pid: 9028, tid: 9136  >>> xxxx <<<
I/DEBUG   ( 8704): at : (2012-10-30 21:10:42.000086303 UTC) 0
I/DEBUG   ( 8704): signal 11 (SIGSEGV), fault addr deadbaad
I/DEBUG   ( 8704):  r0 00000000  r1 afd14691  r2 00000027  r3 00000070
I/DEBUG   ( 8704):  r4 afd42328  r5 00000000  r6 00000000  r7 0000a000
I/DEBUG   ( 8704):  r8 00000000  r9 4a77b900  10 4a77b8d8  fp 00000046
I/DEBUG   ( 8704):  ip 00001750  sp 4a77b590  lr deadbaad  pc afd11ce4  cpsr 60000030
I/DEBUG   ( 8704):  d0  643a64696f72646e  d1  6472656767756265
I/DEBUG   ( 8704):  d2  0000005d0000005b  d3  0006000600060006
I/DEBUG   ( 8704):  d4  0120009c009c009c  d5  000a000a000a000a
I/DEBUG   ( 8704):  d6  0012000600060006  d7  0000000000000000
I/DEBUG   ( 8704):  d8  0000004600000000  d9  43f0000000000000
I/DEBUG   ( 8704):  d10 4040000043080000  d11 0000000043ee464c
I/DEBUG   ( 8704):  d12 0000000000000000  d13 0000000000000000
I/DEBUG   ( 8704):  d14 0000000000000000  d15 0000000000000000
I/DEBUG   ( 8704):  d16 0505050507070707  d17 0b0b0b0b10101010
I/DEBUG   ( 8704):  d18 0707070703030303  d19 0000000000000000
I/DEBUG   ( 8704):  d20 0100010001000100  d21 0100010001000100
I/DEBUG   ( 8704):  d22 0000000000000000  d23 0000000000000000
I/DEBUG   ( 8704):  d24 0000000000000000  d25 0000000000000000
I/DEBUG   ( 8704):  d26 00f900f900f900f9  d27 00fb00fb00fb00fb
I/DEBUG   ( 8704):  d28 00f000f000f000f0  d29 00f500f500f500f5
I/DEBUG   ( 8704):  d30 01748000016e0000  d31 01818000017b0000
I/DEBUG   ( 8704):  scr 20000012
I/DEBUG   ( 8704): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
I/DEBUG   ( 8704): Build fingerprint: \'lge/lge_bprj/lgp970/lgp970:2.2.2/FRG83G/V10a_07-JUN-2011.422D181D:user/release-keys\'
I/DEBUG   ( 8704):          #00  pc 00011ce4  /system/lib/libc.so
I/DEBUG   ( 8704):          #01  pc 0000be32  /system/lib/libc.so
I/DEBUG   ( 8704):          #02  pc 0000cd92  /system/lib/libc.so
I/DEBUG   ( 8704):          #03  pc 000008d8  /system/lib/libstdc++.so
I/DEBUG   ( 8704):          #04  pc 0004efa4  /system/lib/libskia.so
I/DEBUG   ( 8704):          #05  pc 0006d00c  /system/lib/libskia.so
I/DEBUG   ( 8704):          #06  pc 0006f414  /system/lib/libskia.so
I/DEBUG   ( 8704): 
I/DEBUG   ( 8704): code around pc:
I/DEBUG   ( 8704): afd11cc4 2d00682d e029d1fb b12b68db c05cf8df 
I/DEBUG   ( 8704): afd11cd4 f8442001 4798000c e054f8df 26002227 
I/DEBUG   ( 8704): afd11ce4 2000f88e eecaf7fb f7fc2106 f04feff8 
I/DEBUG   ( 8704): afd11cf4 91035180 460aa901 96012006 f7fc9602 
I/DEBUG   ( 8704): afd11d04 a905eb6e 20024632 eb78f7fc eeb6f7fb 
I/DEBUG   ( 8704): 
I/DEBUG   ( 8704): code around lr:
I/DEBUG   ( 8704): deadba8c ffffffff ffffffff ffffffff ffffffff 
I/DEBUG   ( 8704): deadba9c ffffffff ffffffff ffffffff ffffffff 
I/DEBUG   ( 8704): deadbaac ffffffff ffffffff ffffffff ffffffff 
I/DEBUG   ( 8704): deadbabc ffffffff ffffffff ffffffff ffffffff 
I/DEBUG   ( 8704): deadbacc ffffffff ffffffff ffffffff ffffffff 
I/DEBUG   ( 8704): 
I/DEBUG   ( 8704): stack:
I/DEBUG   ( 8704):     4a77b550  00000015  
I/DEBUG   ( 8704):     4a77b554  afd146c1  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b558  afd425a0  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b55c  afd4254c  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b560  00000000  
I/DEBUG   ( 8704):     4a77b564  afd156db  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b568  afd14691  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b56c  afd14691  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b570  00000070  
I/DEBUG   ( 8704):     4a77b574  afd42328  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b578  00000000  
I/DEBUG   ( 8704):     4a77b57c  4a77b5a4  
I/DEBUG   ( 8704):     4a77b580  0000a000  [heap]
I/DEBUG   ( 8704):     4a77b584  afd14933  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b588  df002777  
I/DEBUG   ( 8704):     4a77b58c  e3a070ad  
I/DEBUG   ( 8704): #00 4a77b590  afd43904  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b594  afd103ec  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b598  afd42328  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b59c  49687628  
I/DEBUG   ( 8704):     4a77b5a0  49687628  
I/DEBUG   ( 8704):     4a77b5a4  fffffbdf  
I/DEBUG   ( 8704):     4a77b5a8  afd42328  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b5ac  afd4374c  /system/lib/libc.so
I/DEBUG   ( 8704):     4a77b5b0  49687628  
I/DEBUG   ( 8704):     4a77b5b4  afd0be37  /system/lib/libc.so
I/DEBUG   ( 8704): #01 4a77b5b8  49687660  
I/DEBUG   ( 8704):     4a77b5bc  00430a60  [heap]
I/DEBUG   ( 8704):     4a77b5c0  00001424  
I/DEBUG   ( 8704):     4a77b5c4  4a77b8b0  
I/DEBUG   ( 8704):     4a77b5c8  00000000  
I/DEBUG   ( 8704):     4a77b5cc  49687628  
I/DEBUG   ( 8704):     4a77b5d0  49687628  
I/DEBUG   ( 8704):     4a77b5d4  00000000  
I/DEBUG   ( 8704):     4a77b5d8  4a77b8b0  
I/DEBUG   ( 8704):     4a77b5dc  afd0cd95  /system/lib/libc.so

私の質問:

私はこれからsigsegvが発生するネイティブ関数を見つけることができることを知っていますが、これを見つけるためにネイティブライブラリを取得する場所がわかりません。ユーザーの電話で発生し、直接アクセスできませんまたはユーザーに...これらのライブラリを備えたWebサイトはありますか、それとも電話のサイトと同じままでビルドできますか?または、これらをデバッグするより良い方法はありますか?

読んでくれてありがとう、どんなアイデアでも大歓迎です:-)

更新:

提案どおり、ndk-stackを次のように使用します。

./ndk-stack -sym LONGPATH/armeabi -dump foo.txt

ここで、foo.txtには「ビルドフィンガープリント」の要素が含まれており、星がたくさんある行で始まります(これを検索します)。

********** Crash dump: **********
Build fingerprint: \'lge/lge_bprj/lgp970/lgp970:2.2.2/FRG83G/V10a_07-JUN-2011.422D181D:user/release-keys\'

プログラムが停止します。

edit2:

arm-linux-androideabi-addr2lineとダウンロードしたFRG83G ROMを使用して、さらに少し手に入れました:

ligstdc ++。soで削除するためにlibc.soでdlmalloc_trimおよびreallocを、アラームでSI8_D16_filter_DXDYdrawBitmapclipQuadをポイントします。 libskia.so

楽しい部分が来て、この情報をどうするか..明日続けます、ここは0530です。

edit3:

私はさらに一歩進んでいますが、再び立ち往生しています、ダンプのpc値はlibskia.soの関数を指します。複数のスレッドでPaintオブジェクトを同時に使用すると、この問題が発生する可能性があることを発見しましたが、それはしませんが私はBitmapFactory.Optionsを再利用し、それが問題であることを期待して、その部分を削除しましたが、それでもクラッシュします...ダンプはSkBitmapProcShader::SkBitmapProcShaderSkTriColorShader::shadeSpanおよびSkDraw::drawBitmapを指します。最後の1つは、ビットマップの問題を指摘するのに最も明白です。しかし、それはBitmapFactory.OptionsまたはPaintオブジェクトではありません。

19
Danny

シグナル11の理由を見つけるには、ndk-stackツールを使用する必要があります。支援が必要な場合は、次のリンクを参照してください。

http://yssays.wordpress.com/2011/12/27/Android-ndk-stack-tool/

10
dead programmer

「私は1つのネイティブ関数しか持っていませんが、起動時に一度呼び出され、2〜3分後に問題が発生するため、問題はありません。」

Bzzzztt!違う。メモリを1か所で破棄することは完全に可能です。プログラムの完全に異なる部分にある(現在は破損している)メモリにアクセスしようとすると失敗します。

NDKを使用していると思います。

提案:

1)グローバルメモリーまたはmallocされたバッファーの周りに「センチネル」値を配置します。

2)すべての「malloc()」を慎重に再確認します(「デッドボード」は、ヒープから割り当てられたもののように疑わしく聞こえます)

3)ndk-gdbの使用に関するヒントについては、こちらをご覧ください。

PS:

ネイティブコードはCまたはC++ですか?

7
paulsm4