Android C ++应用程序在链接到共享库阶段时崩溃

时间:2016-07-25 10:49:59

标签: android c++ crash

我有一个hello world C ++应用程序,它与许多3rdpart和自制库相连。使用Segmentation Fault时,它在尝试加载时会立即崩溃。 所有为Linux编译的具有相同依赖关系的相同代码都成功运行。

我该如何开始调试呢? 可能是什么原因?

编辑:这是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加载 如何继续这个?

谢谢!

1 个答案:

答案 0 :(得分:1)

最简单的方法是在调试器下运行你的应用程序,然后最近的android studio非常擅长调试c ++代码。有关如何调试jni代码的说明,请在google code labs中找到使用Android Studio创建Hello-JNI。

其他解决方案是查看logcat,您可能会发现崩溃的原因。例如,您可以找到像

这样的行
I/DEBUG   ( 8704): signal 11 (SIGSEGV), fault addr deadbaad
...
...

将包含发生崩溃的位置的调用堆栈。有了这些信息,您可以使用ndk-stack - 工具(请参阅此处ndk-stack),将框架地址转换为符号名称。

Android会在logcat中添加其他警告/ jni错误,可能会帮助您找到问题的位置。