利用NDK做开发,因为各种原因的不小心,导致了闪退问题,没有stack的话,很难查到问题的所在。这时候ndk-stack出场了。

先看看如下DUMP信息:

********** Crash dump: **********
Build fingerprint: 'OPPO/A33/A33:5.1.1/LMY47V/1390465867:user/release-keys'
pid: , tid: , name: Thread- >>> com.example.dctool <<<
signal (SIGSEGV), code (SEGV_MAPERR), fault addr 0xdeadbaad
Stack frame # pc 00028f20 /system/lib/libc.so (dlfree+)
Stack frame # pc 0000f3e3 /system/lib/libc.so (free+)
Stack frame # pc 000559e3 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPost(char const*, char const*, int)+): Routine ??
??:
Stack frame # pc 00056d9f /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntUploadInfo()+): Routine ??
??:
Stack frame # pc 00059f3f /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnPingNotify(unisdk::PingRet&)+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::statistics()+): Routine ??
??:
Stack frame # pc 000585ed /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::ping(int, int)+): Routine ??
??:
Stack frame # pc 00054bad /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPingBaidu()+): Routine ??
??:
Stack frame # pc 00059f6f /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnPingNotify(unisdk::PingRet&)+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::statistics()+): Routine ??
??:
Stack frame # pc 000585ed /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::ping(int, int)+): Routine ??
??:
Stack frame # pc 000547c1 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPingQQ()+): Routine ??
??:
Stack frame # pc 00059edf /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnPingNotify(unisdk::PingRet&)+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::statistics()+): Routine ??
??:
Stack frame # pc 000585ed /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc 000585dd /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::recv_packet()+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::ntping::ping(int, int)+): Routine ??
??:
Stack frame # pc /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntPing163()+): Routine ??
??:
Stack frame # pc 0005aa31 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+): Routine ??
??:
Stack frame # pc 000552a3 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntHead(char const*, int)+): Routine ??
??:
Stack frame # pc 0005aab1 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+): Routine ??
??:
Stack frame # pc 000552a3 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntHead(char const*, int)+): Routine ??
??:
Stack frame # pc 0005a9db /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+): Routine ??
??:
Stack frame # pc 000552a3 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntHead(char const*, int)+): Routine ??
??:
Stack frame # pc 0005ac51 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+): Routine ??
??:
Stack frame # pc 000556e9 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntGet(char const*, int, int)+): Routine ??
??:
Stack frame # pc 0005ada3 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::Tobserver::OnHttpNotify(unisdk::HttpRet&)+): Routine ??
??:
Stack frame # pc 000556e9 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::NtExecutor::ntGet(char const*, int, int)+): Routine ??
??:
Stack frame # pc 0005b6e7 /data/app/com.example.dctool-/lib/arm/libunisdkdctool.so (unisdk::nttool::ntStartExecute(void*)+): Routine ??
??:
Stack frame # pc 000134a3 /system/lib/libc.so (__pthread_start(void*)+)
Stack frame # pc 000114a7 /system/lib/libc.so (__start_thread+)

上面的信息是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

打完收工!

Android使用ndk-stack获取so奔溃堆栈的更多相关文章

  1. android app记录执行日志 捕获奔溃异常 ,存储日志到文件

    app在执行过程中.为了后期的维护升级,记录日志是一个很好的方法. 为了读取到app执行时的日志,一般的作法是单独开一个线程,在app执行的启动线程.然后app退出时停掉线程. 然而我们更好的方法是开 ...

  2. address2line 定位 Android c++奔溃位置

    Android调用c++出现奔溃,崩溃信息为如下: 10-11 15:15:13.541 D/AudioMTKStreamOut( 139): write(), buffer = 0x42bd9390 ...

  3. android 抓取native层奔溃

    使用android的breakpad工具 使用这个工具需要下载Breakpad的源码,然后进行编译,编译之后会生成两个工具 我们使用这两个工具来解析奔溃的位置.这里我们可以下载已经编译好的工具 下载地 ...

  4. Android 如何避免运行时奔溃

    奔溃问题 android运行的时候难免会有一些空指针(NullPointerException)或者下标越界(IndexOutOfBoundsException),用户使用的过程操作某一个按钮的时候, ...

  5. Android jni c/c++线程通过CallVoidMethod调用java函数出现奔溃问题

    最近在移植网络摄像机里的p2p库到android平台,需要用到jni,最近在c线程了调用java函数的时候 出现一个问题,假如在同一个线程调用java函数是没问题的,但在一个c线程了调用java函数就 ...

  6. iOS全埋点解决方案-采集奔溃

    前言 ​ 采集应用程序奔溃信息,主要分为以下两种场景: ​ NSException 异常 ​ Unix 信号异常 一.NSException 异常 ​ NSException 异常是 Objectiv ...

  7. Android Studio NDK初探

    Android Studio中实现NDK开发较之前Eclipse+Cygwin,方便了很多. 本文以最简单的从C程序中获取字符串,并显示到MainActivity的TextView上为例进行NDK开发 ...

  8. Android Studio NDK 学习之接受Java传入的字符串

    本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫Prompt,其 ...

  9. Android Studio NDK 学习之接受Java传入的Int数组

    本博客是基于Android Studio 1.3 preview版本,且默认你已经安装了Android SDK, Android NDK. 用Android Studio新建一个工程叫AndroidJ ...

随机推荐

  1. 对jquery的ajax进行二次封装

    第一种方法: $(function(){ /** * ajax封装 * url 发送请求的地址 * data 发送到服务器的数据,数组存储,如:{"username": " ...

  2. vim_cfg

    set nocompatible set langmenu=en_US let $LANG = 'en_US' source $VIMRUNTIME/delmenu.vim source $VIMRU ...

  3. ArcEngine 岛状多边形内部环的获取

    ArcEngine岛状多边形获取其内部环 查阅了帮助文档相关接口,内部环的获方法get_InteriorRingBag() 需要外部环作为参数.而外部环可以直接通过ExteriorRingBag属性获 ...

  4. Activity与Fragment

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似. Fragment是用来描述一些行为或一部分用户界面在一个Activi ...

  5. bzoj 3438: 小M的作物

    Description 背景 小M还是个特么喜欢玩MC的孩纸... 描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一 ...

  6. NC57,NC63-NC二开经验总结

    版主2010级市场营销专业本科生 2013年8月入达内培训Java相关技术 12月入职,做用友NC的二次开发工作 2015年4月离职,4中下旬入职一家互联网金融企业 下面是做NC二开期间积累的一些常用 ...

  7. C++ 一次创建多级目录

    #ifdef WIN32 #include <io.h> #include <direct.h> #else #include <unistd.h> #includ ...

  8. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  9. GIT远程仓库地址变更

    将VS2013的解决方案添加到GIT源代码管理后会增加.gitattributes和.gitignore 2个文件以及.git目录 设置远程地址的文件在.git目录下的config文件中 直接修改上图 ...

  10. css3图片翻转

    <!DOCTYPE> <html lang="en"> <head> <meta http-equiv="Content-Typ ...