2012-07-06 54 views
12

下面的代码会导致分割故障打印后弦:STL链接到一个独立的Android NDK可执行

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "ndktest" << endl; 
    return 0; 
} 
  • 如果我COUT改变对printf,它不会崩溃。
  • 如果我在不同于main的函数中调用cout,并且该函数从未被访问过,它仍然会崩溃。
  • 它在Froyo上崩溃,但不是ICS。

供参考,这是我的Android.mk:

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := ndktest 
LOCAL_SRC_FILES := main.cpp 

include $(BUILD_EXECUTABLE) 

和Application.mk:

APP_STL := stlport_static 

下面是从logcat的崩溃:

I/DEBUG ( 872): pid: 4234, tid: 4234 >>> /data/ndktest <<< 
I/DEBUG ( 872): signal 11 (SIGSEGV), fault addr 00024004 
I/DEBUG ( 872): r0 00033824 r1 00001000 r2 00024005 r3 bea42cfc 
I/DEBUG ( 872): r4 40008090 r5 0000000a r6 40008000 r7 afd42328 
I/DEBUG ( 872): r8 00000000 r9 00000000 10 00000000 fp 00000000 
I/DEBUG ( 872): ip 40008084 sp bea42ce8 lr afd192dd pc 00024004 cpsr 60000030 
I/DEBUG ( 872): d0 0000000000000000 d1 0000000000000000 
I/DEBUG ( 872): d2 0000000000000000 d3 0000000000000000 
I/DEBUG ( 872): d4 0000000000000000 d5 0000000000000000 
I/DEBUG ( 872): d6 0000000000000000 d7 0000000000000000 
I/DEBUG ( 872): d8 0000000000000000 d9 0000000000000000 
I/DEBUG ( 872): d10 0000000000000000 d11 0000000000000000 
I/DEBUG ( 872): d12 0000000000000000 d13 0000000000000000 
I/DEBUG ( 872): d14 0000000000000000 d15 0000000000000000 
I/DEBUG ( 872): scr 00000000 
I/DEBUG ( 872): 
I/DEBUG ( 872):   #00 pc 00024004 
I/DEBUG ( 872):   #01 pc 000192da /system/lib/libc.so 
I/DEBUG ( 872):   #02 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #03 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #04 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #05 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #06 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #07 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #08 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #09 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #10 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #11 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #12 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #13 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #14 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #15 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #16 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #17 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #18 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #19 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #20 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #21 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #22 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #23 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #24 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #25 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #26 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #27 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #28 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #29 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #30 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872):   #31 pc 0001972c /system/lib/libc.so 
I/DEBUG ( 872): 
I/DEBUG ( 872): code around pc: 
I/DEBUG ( 872): 00023fe4 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00023ff4 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00024004 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00024014 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 00024024 ffffffff ffffffff ffffffff ffffffff 
I/DEBUG ( 872): 
I/DEBUG ( 872): code around lr: 
I/DEBUG ( 872): afd192bc f8cde018 f7f4e00c b930ec56 0c0cf844 
I/DEBUG ( 872): afd192cc 46302201 f7f49900 9803ec4e 47909a05 
I/DEBUG ( 872): afd192dc f1153c0c d5d735ff 2e006836 463cd1ce 
I/DEBUG ( 872): afd192ec b9b99901 c03cf8df 300cf857 f8471e58 
I/DEBUG ( 872): afd192fc b978000c 587a490c e0046810 68059900 
I/DEBUG ( 872): 
I/DEBUG ( 872): stack: 
I/DEBUG ( 872):  bea42ca8 b000c9b8 
I/DEBUG ( 872):  bea42cac 00000014 
I/DEBUG ( 872):  bea42cb0 b00093e0 /system/bin/linker 
I/DEBUG ( 872):  bea42cb4 b001e9b8 
I/DEBUG ( 872):  bea42cb8 b000c9b8 
I/DEBUG ( 872):  bea42cbc b0001c78 /system/bin/linker 
I/DEBUG ( 872):  bea42cc0 b001e724 
I/DEBUG ( 872):  bea42cc4 00000005 
I/DEBUG ( 872):  bea42cc8 b000c9b8 
I/DEBUG ( 872):  bea42ccc b0001de3 /system/bin/linker 
I/DEBUG ( 872):  bea42cd0 b000c9b8 
I/DEBUG ( 872):  bea42cd4 b0002c77 /system/bin/linker 
I/DEBUG ( 872):  bea42cd8 00000000 
I/DEBUG ( 872):  bea42cdc b001ffe8 
I/DEBUG ( 872):  bea42ce0 df002777 
I/DEBUG ( 872):  bea42ce4 e3a070ad 
I/DEBUG ( 872): #01 bea42ce8 00001000 
I/DEBUG ( 872):  bea42cec 00000000 
I/DEBUG ( 872):  bea42cf0 bea42cfc 
I/DEBUG ( 872):  bea42cf4 00033824 
I/DEBUG ( 872):  bea42cf8 00000000 
I/DEBUG ( 872):  bea42cfc 00024005 
I/DEBUG ( 872):  bea42d00 00033824 
I/DEBUG ( 872):  bea42d04 00000000 
I/DEBUG ( 872):  bea42d08 00000000 
I/DEBUG ( 872):  bea42d0c 00000000 
I/DEBUG ( 872):  bea42d10 b000c9b8 
I/DEBUG ( 872):  bea42d14 00000000 
I/DEBUG ( 872):  bea42d18 00000000 
I/DEBUG ( 872):  bea42d1c afd19731 /system/lib/libc.so 
I/BootReceiver( 946): Copying /data/tombstones/tombstone_09 to DropBox (SYSTEM_TOMBSTONE) 

通过运行这个堆栈跟踪工具没有产生任何符号信息。

更新:

在故障转储(0001972c在/system/lib/libc.so)的PC值是在退出例程,这与崩溃被印刷后的字符串一致的:

00019728 <exit>: 
    19728: 4604  mov r4, r0 
    1972a: 2000  movs r0, #0 
    1972c: f7ff fd8c bl 19248 <__cxa_finalize> 
    19730: 4620  mov r0, r4 
    19732: f7f3 ee96 blx d460 <_exit> 
    19736: bf00  nop 
+0

你有没有看过将'LOCAL_LDLIBS + = -ldl'和'LOCAL_SHARED_LIBRARIES + = libdl'添加到你的Android.mk中?我特别说“dl”的原因是动态链接部分链接到共享库中的stlport。 – t0mm13b 2012-07-13 21:04:16

+0

@ t0mm13b:我试过了,但运行程序时仍然出现“CAN NOT LINK EXECUTABLE”。我将如何加载main()中的libstlport_shared.so? – Ravi 2012-07-13 23:00:01

+0

http://stackoverflow.com/questions/7339229/android-std-and-stl-support,http://sseyod.blogspot.ie/2009/08/android-jni-ndk-and-stl-support.html ,http://stackoverflow.com/questions/1650963/ustl-or-stlport-for-android < - 最后一个链接可能是答案...检查出来:) – t0mm13b 2012-07-13 23:58:46

回答

5

这可能是由于您使用stlport_static而不是stlport_shared。

在NDK文档(包中包含CPLUSPLUS-SUPPORT.html)中,描述了此行为。这种不可预知的行为来自这样一个事实:如果应用程序链接到两个(或更多)共享库,并且两者都链接到stlport_static,则某些符号可能会被复制,从而导致不正确的行为。

+0

我的项目中没有任何共享库。在我上面的makefile中,我只是构建了一个静态链接STL的可执行文件。是否有我需要切换到STL的共享版本的原因? – Ravi 2012-07-09 16:47:39

+0

@Ravi:试试吧,看看它是否工作... – Goz 2012-07-10 06:40:53

+0

我不清楚如何使用STL作为NDK层的共享库。如果我使用stlport_shared,那么文档说要在静态Java初始化器中加载库。这是否意味着我需要将它构建为apk?我试图保留这个项目作为一个纯NDK可执行文件,因为它有一个命令行界面,我想使它成为/ system/xbin的一部分。 – Ravi 2012-07-10 13:45:57