利用NDK做开发,因为各种原因的不小心,导致了闪退问题,没有stack的话,很难查到问题的所在。这时候ndk-stack出场了。
先看看如下DUMP信息:
********** Crash dump: ********** Build fingerprint: 'OPPO/A33/A33:5.1.1/LMY47V/1390465867:user/release-keys' pid: 1335, tid: 1398, name: Thread-4214 >>> com.example.dctool <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xdeadbaad Stack frame #00 pc 00028f20 /system/lib/libc.so (dlfree+1239) Stack frame #01 pc 0000f3e3 /system/lib/libc.so (free+10) Stack frame #02 pc 000559e3 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPost(char const*, char const*, int)+318): Routine ?? ??:0 Stack frame #03 pc 00056d9f /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntUploadInfo()+2638): Routine ?? ??:0 Stack frame #04 pc 00059f3f /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnPingNotify(unisdk::PingRet&)+1094): Routine ?? ??:0 Stack frame #05 pc 00058121 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::statistics()+512): Routine ?? ??:0 Stack frame #06 pc 000585ed /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+48): Routine ?? ??:0 Stack frame #07 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #08 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #09 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #10 pc 00058933 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::ping(int, int)+322): Routine ?? ??:0 Stack frame #11 pc 00054bad /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPingBaidu()+276): Routine ?? ??:0 Stack frame #12 pc 00059f6f /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnPingNotify(unisdk::PingRet&)+1142): Routine ?? ??:0 Stack frame #13 pc 00058121 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::statistics()+512): Routine ?? ??:0 Stack frame #14 pc 000585ed /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+48): Routine ?? ??:0 Stack frame #15 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #16 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #17 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #18 pc 00058933 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::ping(int, int)+322): Routine ?? ??:0 Stack frame #19 pc 000547c1 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPingQQ()+276): Routine ?? ??:0 Stack frame #20 pc 00059edf /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnPingNotify(unisdk::PingRet&)+998): Routine ?? ??:0 Stack frame #21 pc 00058121 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::statistics()+512): Routine ?? ??:0 Stack frame #22 pc 000585ed /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+48): Routine ?? ??:0 Stack frame #23 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #24 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #25 pc 000585dd /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+32): Routine ?? ??:0 Stack frame #26 pc 00058933 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::ntping::ping(int, int)+322): Routine ?? ??:0 Stack frame #27 pc 00054385 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPing163()+276): Routine ?? ??:0 Stack frame #28 pc 0005aa31 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+504): Routine ?? ??:0 Stack frame #29 pc 000552a3 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntHead(char const*, int)+230): Routine ?? ??:0 Stack frame #30 pc 0005aab1 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+632): Routine ?? ??:0 Stack frame #31 pc 000552a3 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntHead(char const*, int)+230): Routine ?? ??:0 Stack frame #32 pc 0005a9db /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+418): Routine ?? ??:0 Stack frame #33 pc 000552a3 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntHead(char const*, int)+230): Routine ?? ??:0 Stack frame #34 pc 0005ac51 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+1048): Routine ?? ??:0 Stack frame #35 pc 000556e9 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntGet(char const*, int, int)+240): Routine ?? ??:0 Stack frame #36 pc 0005ada3 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+1386): Routine ?? ??:0 Stack frame #37 pc 000556e9 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntGet(char const*, int, int)+240): Routine ?? ??:0 Stack frame #38 pc 0005b6e7 /data/app/com.example.dctool-1/lib/arm/libunisdkdctool.so (unisdk::nttool::ntStartExecute(void*)+30): Routine ?? ??:0 Stack frame #39 pc 000134a3 /system/lib/libc.so (__pthread_start(void*)+30) Stack frame #40 pc 000114a7 /system/lib/libc.so (__start_thread+6)
上面的信息是ndk-stack解析出来的信息,使用命令如下:
adb logcat | $NDK_HOME/ndk-stack -sym $PROJECT/libs/armeabi
其中,$PROJECT/libs/armeabi是so的路径。
解析出来的stack顶部地址,便是引发crash的代码行,可以利用addr2line做进一步的分析,查出引发crash的API,使用如下:
arm-linux-androideabi-addr2line -a 000556ff -e libunisdkdctool.so -f -C
打完收工!