我有一个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加载 如何继续这个?
谢谢!
答案 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错误,可能会帮助您找到问题的位置。