2016-07-25 14 views
-1

私は、多くの3rdパートライブラリと自家製ライブラリとリンクするhello world C++アプリケーションを持っています。 Segmentation Faultを使用して、ロードしようとするとすぐにクラッシュします。 同じ依存関係を持ち、Linux向けにコンパイルされた同じコードが正常に実行されます。Android C++アプリケーションが共有ライブラリステージへのリンク時にクラッシュする

どうすればデバッグを開始できますか?
理由は何でしょうか?

編集:これは、プリントをlogcatものです:

F/libc (8129): Fatal signal 11 (SIGSEGV), code 128, fault addr 0x0 in tid 8129 (HelloWorldApp) I/DEBUG (2876): *** *** *** *** *** *** 
*** *** *** *** *** *** *** *** *** *** I/DEBUG (2876): Build fingerprint: 'Intel/cht_hr/cht_hr:5.1.1/LMY47Z/LS0000037:userdebug/test-keys' I/DEBUG (2876): Revision: '0' W/NativeCrashListener(3194): Couldn't find ProcessRecord for pid 8129 I/DEBUG (2876): ABI: 'x86' I/DEBUG (2876): pid: 8129, tid: 8129, name: HelloWorldApp >>> ./StaticImageOR <<< E/DEBUG (2876): AM write failure (32/Broken pipe) I/DEBUG (2876): signal 11 (SIGSEGV), code 128 (SI_KERNEL), fault addr 0x0 I/DEBUG (2876):  eax ff84cadc ebx f32b7c6c ecx 00000010 edx 00000000 I/DEBUG (2876):  esi f32c6610 edi 00000000 I/DEBUG (2876):  xcs 00000023 xds 0000002b xes 0000002b xfs 00000000 xss 0000002b I/DEBUG (2876):  eip f2600cfb ebp ff84c6dc esp ff84c5f4 flags 00010246 I/DEBUG (2876): I/DEBUG (2876): backtrace: I/DEBUG (2876):  #00 pc 0062fcfb /system/lib/libcommander.so I/DEBUG (2876):  #01 pc 0017651f /system/lib/libcommander.so I/DEBUG (2876):  #02 pc 00001fcb /system/bin/linker (__dl__ZN6soinfo16CallConstructorsEv.part.23+1275) I/DEBUG (2876): 
#03 pc 00001c26 /system/bin/linker (__dl__ZN6soinfo16CallConstructorsEv.part.23+342) I/DEBUG (2876): 
#04 pc 00001c26 /system/bin/linker (__dl__ZN6soinfo16CallConstructorsEv.part.23+342) I/DEBUG (2876): 
#05 pc 00008706 /system/bin/linker (__dl___linker_init+4998) I/DEBUG (2876):  #06 pc 00009e0e /system/bin/linker (__dl__start+30) I/DEBUG (2876): I/DEBUG (2876): Tombstone written to: /data/tombstones/tombstone_02 

だから私はこの問題は、libcommanderの負荷であるundersatnd。
これを続ける方法?

ありがとうございます!

+0

エミュレータを使用してデバッガで実行しますか?何千もの理由のいずれかになる可能性があります。 –

+0

@JoachimPileborg:それはまさに私の質問です:どのように私はそれをデバッグできますか? –

+0

AndroidはロックダウンサブセットAPI(CおよびC++)なので、ライブラリがAndroid C/C++ライブラリに存在しない(または制限されている)関数を呼び出している可能性があります。 libcomanderはあなたのデバイスに根ざしていますか? –

答えて

1

最も簡単な方法は、デバッガの下でアプリケーションを実行することです、そして、最近のアンドロイドのスタジオは、C++コードのデバッグに本当にうまくいきます。 jniコードをデバッグする方法については、google code labsにAndroidスタジオでHello-JNIを作成するをご覧ください。

その他の解決方法は、logcatを調べることです。クラッシュする理由があるかもしれません。たとえば、

I/DEBUG (8704): signal 11 (SIGSEGV), fault addr deadbaad 
... 
... 

のような行は、クラッシュが発生する場所のコールスタックを含むことができます。その情報を使用して、ndk-stack - ツール(ndk-stackを参照)を使用して、フレームアドレスを記号名に変えることができます。

Androidは、問題の場所を見つけるのに役立つかもしれない他のwarnings/jniエラーをlogcatに入れます。

関連する問題