2012-09-14 226 views
1

我有一個在cocos2d-x引擎的幫助下實現的Android應用程序。 我聯繫的protobuf庫項目,並試圖SerializeToStrint()一個原對象:Android應用程序崩潰,因爲protobuf

ProtoMessage message; 
message.set_app_id(1111); 
message.set_hardware_id("test string"); 

std::string str; 

message.SerializeToString(&str); 

這是建立很好,但是當我試圖啓動應用程序的logcat給我一個日誌:

09-14 10:26:51.748 13009 13009 I DEBUG : Build fingerprint: 
verizon/droid2we_vzw/cdma_droid2we:2.3.4/4.5.1_57_D2GA-59/120117:user/release-keys 
09-14 10:26:51.748 13009 13009 I DEBUG : pid: 12996, tid: 13008 >>> com.karmicapps <<< 
09-14 10:26:51.748 13009 13009 I DEBUG : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad 
09-14 10:26:51.748 13009 13009 I DEBUG : r0 00000027 r1 deadbaad r2 a0000000 r3 00000000 
09-14 10:26:51.748 13009 13009 I DEBUG : r4 00000001 r5 00000000 r6 81b15340 r7 0000a000 
09-14 10:26:51.748 13009 13009 I DEBUG : r8 818d4ed1 r9 44df07c8 10 00100000 fp 00000001 
09-14 10:26:51.748 13009 13009 I DEBUG : ip afd466c8 sp 45ac1df8 lr afd19239 pc afd15d08 cpsr 60000070 
09-14 10:26:51.748 13009 13009 I DEBUG : d0 643a64696f72646e d1 6472656767756265 
09-14 10:26:51.748 13009 13009 I DEBUG : d2 0049002e00690045 d3 0066007200750047 
09-14 10:26:51.748 13009 13009 I DEBUG : d4 0000000000000000 d5 0000000100000000 
09-14 10:26:51.748 13009 13009 I DEBUG : d6 000000000000f760 d7 0000000000000000 
09-14 10:26:51.748 13009 13009 I DEBUG : d8 0000000000000000 d9 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : d10 0000000000000000 d11 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : d12 0000000000000000 d13 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : d14 0000000000000000 d15 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : d16 3fdd938000000280 d17 3fdfffffffffe114 
09-14 10:26:51.756 13009 13009 I DEBUG : d18 3fe0000000000000 d19 3fe0000000000f76 
09-14 10:26:51.756 13009 13009 I DEBUG : d20 0000000000000000 d21 3f872e5c54a96637 
09-14 10:26:51.756 13009 13009 I DEBUG : d22 3e21e7c5992989f4 d23 bda8fae9be8838d4 
09-14 10:26:51.756 13009 13009 I DEBUG : d24 3fc74721cad6b0ed d25 3fc39a09d078c69f 
09-14 10:26:51.756 13009 13009 I DEBUG : d26 0000000000000000 d27 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : d28 0000000000000000 d29 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : d30 0000000000000000 d31 0000000000000000 
09-14 10:26:51.756 13009 13009 I DEBUG : scr 20000012 
09-14 10:26:51.756 13009 13009 I DEBUG : 
09-14 10:26:51.803 13009 13009 I DEBUG :   #00 pc 00015d08 /system/lib/libc.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #01 pc 00013674 /system/lib/libc.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #02 pc 0001453a /system/lib/libc.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #03 pc 000a45ec /data/data/com.example/lib/libprotobuf.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #04 pc 000a46d0 /data/data/com.example/lib/libprotobuf.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #05 pc 000445ac /data/data/com.example/lib/libprotobuf.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #06 pc 000445f6 /data/data/com.example/lib/libprotobuf.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #07 pc 00044616 /data/data/com.example/lib/libprotobuf.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #08 pc 000d51f8 /data/data/com.example/lib/libpromowall.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #09 pc 000d4ee4 /data/data/com.example/lib/libpromowall.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #10 pc 0001194c /system/lib/libc.so 
09-14 10:26:51.803 13009 13009 I DEBUG :   #11 pc 00011510 /system/lib/libc.so 
09-14 10:26:51.803 13009 13009 I DEBUG : 
09-14 10:26:51.803 13009 13009 I DEBUG : code around pc: 
09-14 10:26:51.803 13009 13009 I DEBUG : afd15ce8 2c006824 e028d1fb b13368db c064f8df 
09-14 10:26:51.803 13009 13009 I DEBUG : afd15cf8 44fc2401 4000f8cc 49124798 25002027 
09-14 10:26:51.803 13009 13009 I DEBUG : afd15d08 f7f57008 2106ec72 edd6f7f6 460aa901 
09-14 10:26:51.803 13009 13009 I DEBUG : afd15d18 f04f2006 95015380 95029303 e934f7f6 
09-14 10:26:51.803 13009 13009 I DEBUG : afd15d28 462aa905 f7f62002 f7f5e940 2106ec5e 
09-14 10:26:51.803 13009 13009 I DEBUG : 
09-14 10:26:51.803 13009 13009 I DEBUG : code around lr: 
09-14 10:26:51.803 13009 13009 I DEBUG : afd19218 4a0e4b0d e92d447b 589c41f0 26004680 
09-14 10:26:51.803 13009 13009 I DEBUG : afd19228 686768a5 f9b5e006 b113300c 47c04628 
09-14 10:26:51.803 13009 13009 I DEBUG : afd19238 35544306 37fff117 6824d5f5 d1ef2c00 
09-14 10:26:51.811 13009 13009 I DEBUG : afd19248 e8bd4630 bf0081f0 00028344 ffffff88 
09-14 10:26:51.811 13009 13009 I DEBUG : afd19258 b086b570 f602fb01 9004460c a804a901 
09-14 10:26:51.811 13009 13009 I DEBUG : 
09-14 10:26:51.811 13009 13009 I DEBUG : stack: 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1db8 00000000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dbc 00000000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dc0 00000000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dc4 00000000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dc8 afd4276c 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dcc afd42718 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dd0 00000000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dd4 afd19239 /system/lib/libc.so 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dd8 00000001 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1ddc 45ac1e0c 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1de0 81b15340 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1de4 0000a000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1de8 818d4ed1 /data/data/com.karmicapps/lib/libpromowall.so 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dec afd1855b /system/lib/libc.so 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1df0 df002777 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1df4 e3a070ad 
09-14 10:26:51.811 13009 13009 I DEBUG : #00 45ac1df8 0000001b 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1dfc 0000000e 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e00 45ac1eac 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e04 002ddb2c 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e08 81b15340 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e0c fffffbdf 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e10 818d4ed1 /data/data/com.karmicapps/lib/libpromowall.so 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e14 afd464b0 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e18 002ddb2c 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e1c afd13679 /system/lib/libc.so 
09-14 10:26:51.811 13009 13009 I DEBUG : #01 45ac1e20 45ac1eac 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e24 002ddb2c 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e28 0000000e 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e2c 00000000 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e30 818d4ed1 /data/data/com.karmicapps/lib/libpromowall.so 
09-14 10:26:51.811 13009 13009 I DEBUG :  45ac1e34 afd1453d /system/lib/libc.so 

請有人可以解釋我的原因嗎?

UPDATE 但如果我初始化這樣的方式串:

ProtoMessage message; 
message.set_app_id(1111); 
message.set_hardware_id("test string"); 

std::string str; 
str = "test"; 

message.SerializeToString(&str); 

一切都很好,和原正常序列化

修訂我在下面

新的堆棧add2line結果跟蹤:

#00 pc 00016f20 /system/lib/libc.so 
#01 pc 00014878 /system/lib/libc.so 
#02 pc 00015756 /system/lib/libc.so 
#03 pc 0018dd64 /data/data/com.example/lib/libprotobuf.so ---- std::string::reserve(unsigned int) 
#04 pc 0018de60 /data/data/com.example/lib/libprotobuf.so ---- std::string::append(unsigned int, char) 
#05 pc 000eff6c /data/data/com.example/lib/libprotobuf.so ---- google::protobuf::STLStringResizeUninitialized(std::string*, unsigned int) 
#06 pc 000f1c96 /data/data/com.example/lib/libprotobuf.so ---- google::protobuf::internal::WireFormatLite::ReadString(google::protobuf::io::CodedInputStream*, std::string*) 
#07 pc 001013b4 /data/data/com.example/lib/libpromowall.so ---- google::protobuf::DescriptorBuilder::NewPlaceholderFile(std::string const&) 

UPDATE 和最煩人的問題我無法解析沒有字符串字段初始化的proto對象。

//str - serializing protobuf object 
RegistrationRequest request; 
request.ParseFromString(str); 

錯誤! 當我在我的桌面機上的測試應用程序中編譯時,一切都很好。 但是如果我通過了cocos2d-x的腳本(ndk.r7)對移動設備的應用程序崩潰編譯

+0

您是否知道可以使用** addr2line **來查找每個調用堆棧的源代碼? –

+0

我會試試這個。謝謝。 但我認爲問題是在單位字符串。 – Ivan

+0

我毫不懷疑問題是ProtoMessage有一個空字符串的錯誤,但你可以找到錯誤的確切源代碼行! –

回答

4

確保libprotobuf.solibpromowall.so使用相同的STL實現內置:要麼stlport_sharedgnustl_shared

+1

謝謝Alex。我在一小時前解決了這個問題。所有的技巧都在gnustl庫中。我像**靜態**庫鏈接該庫。但是我已經閱讀了ndk手冊: '請記住,給定C++運行庫的靜態庫變體只能鏈接到單個二進制文件以獲得最佳條件。' – Ivan

+1

我發現** stlport_shared **導致編譯錯誤,但** gnustl_shared **工作正常。謝謝! –