Android调用c++出现奔溃,崩溃信息为如下:
10-11 15:15:13.541 D/AudioMTKStreamOut( 139): write(), buffer = 0x42bd9390 bytes = 8192 mLatency = 92
10-11 15:15:13.562 I/PowerManagerService( 513): setBrightness mButtonLight, screenBrightness=245
10-11 15:15:13.575 I/DEBUG ( 9136): r0 40000001 r1 61e2a7a8 r2 becc2224 r3 becc2220
10-11 15:15:13.575 I/DEBUG ( 9136): r4 40000001 r5 61e2a7a8 r6 5f5501a0 r7 61e2a768
10-11 15:15:13.575 I/DEBUG ( 9136): r8 becc25bc r9 41b76d00 sl 41b70020 fp becc25d4
10-11 15:15:13.575 I/DEBUG ( 9136): ip 00000000 sp becc220c lr 60e6abd7 pc 610a672e cpsr 00000030
10-11 15:15:13.575 I/DEBUG ( 9136):
10-11 15:15:13.575 I/DEBUG ( 9136): backtrace:
10-11 15:15:13.575 I/DEBUG ( 9136): #00 pc 006d372e /data/data/com.linekong.dgr.langang/files/so_path/libgame.so (cocos2d::CCDictionary::setObject(cocos2d::CCObject*, std::string const&)+1)
10-11 15:15:13.575 I/DEBUG ( 9136): #01 pc 000203c4 [stack]
10-11 15:15:13.575 I/DEBUG ( 9136):
10-11 15:15:13.575 I/DEBUG ( 9136): stack:
10-11 15:15:13.575 I/DEBUG ( 9136): becc21cc 40049b30 /system/lib/libc.so (malloc+20)
10-11 15:15:13.575 I/DEBUG ( 9136): becc21d0 00000025
10-11 15:15:13.575 I/DEBUG ( 9136): becc21d4 612bfd8c /data/data/com.linekong.dgr.langang/files/so_path/libgame.so (operator new(unsigned int)+24)
10-11 15:15:13.575 I/DEBUG ( 9136): becc21d8 00000008
10-11 15:15:13.576 I/DEBUG ( 9136): becc21dc 61e2a794
10-11 15:15:13.576 I/DEBUG ( 9136): becc21e0 61e2a794
10-11 15:15:13.576 I/DEBUG ( 9136): becc21e4 612aa388 /data/data/com.linekong.dgr.langang/files/so_path/libgame.so
10-11 15:15:13.576 I/DEBUG ( 9136): becc21e8 61e2a7d4
10-11 15:15:13.576 I/DEBUG ( 9136): becc21ec 60eb781b /data/data/com.linekong.dgr.langang/files/so_path/libgame.so
10-11 15:15:13.576 I/DEBUG ( 9136): becc21f0 61e2a794
10-11 15:15:13.576 I/DEBUG ( 9136): becc21f4 00000008
10-11 15:15:13.576 I/DEBUG ( 9136): becc21f8 becc2220 [stack]
10-11 15:15:13.576 I/DEBUG ( 9136): becc21fc becc2224 [stack]
10-11 15:15:13.576 I/DEBUG ( 9136): becc2200 df002777
10-11 15:15:13.576 I/DEBUG ( 9136): becc2204 e3a070ad
10-11 15:15:13.576 I/DEBUG ( 9136): becc2208 61e2a768
10-11 15:15:13.576 I/DEBUG ( 9136): #00 becc220c 40000001
10-11 15:15:13.576 I/DEBUG ( 9136): becc2210 61e2a7a8
10-11 15:15:13.576 I/DEBUG ( 9136): becc2214 5f5501a0
10-11 15:15:13.576 I/DEBUG ( 9136): becc2218 61e2a768
10-11 15:15:13.576 I/DEBUG ( 9136): becc221c 60e6abd7 /data/data/com.linekong.dgr.langang/files/so_path/libgame.so (CCJsonData::setStringValue(std::string, std::string)+58)
10-11 15:15:13.576 I/DEBUG ( 9136): becc2220 5f5501a0
10-11 15:15:13.576 I/DEBUG ( 9136): becc2224 61e2a7d4
10-11 15:15:13.576 I/DEBUG ( 9136): becc2228 becc231c [stack]
10-11 15:15:13.576 I/DEBUG ( 9136): becc222c 614ba9f0 /data/data/com.linekong.dgr.langang/files/so_path/libgame.so
这时候我们怎么查看奔溃点呢,可以使用address2line。
我的是mac版本的NDK_r8e,它的位置在
$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/darwin-x86_64/bin
;
你可以把这个路径添加到环境变量中,然后在工程的根目录下执行如下命令了。
arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so <address>
这边的address是崩溃的起始点,#00 pc开头的后面的那个地址。像我们可以看第9行的崩溃信息得到地址006d372e。
arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libXXX.so 006d372e
可以看到最后等到下面这样的信息
./arm-linux-androideabi-addr2line -C -f -e obj/local/armeabi/libgame.so 006d372e
cocos2d::CCDictionary::setObject(cocos2d::CCObject*, std::string const&)
/Users/chuanwei/project/battlegirl/project/BattleGirl/proj.android/game/../../../cocos2dx/cocoa/CCDictionary.cpp:213
最后找到问题了。
附加:这边提供另外一个方式查找问题,利用google提供的脚本,脚本地址
http://code.google.com/p/android-ndk-stacktrace-analyzer/
使用 adb logcat -d > logfile 导出 crash 的log,然后用arm-linux-androideabi-objdump,跟arm-linux-androideabi-addr2line位于同一个目录下,
把so或exe转换成汇编代码,如:arm-linux-androideabi-addr2line -S mylib.so > mylib.asm,
使用脚本 python parse_stack.py <asm-file> <logcat-file> 解析。