利用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. 《bootstrap》实战---小问题,大Bug

    参照书中代码写了个示例,能够实现大页面单行导航,小页面显示收缩按钮,但是就是不能让收缩按钮发挥作用.也不知道哪儿出了问题. 想想算了,代码也不多,重新来吧.写道导航的时候,突然发现一个<nav& ...

  2. Spark 架构

    本文转之Pivotal的一个工程师的博客.觉得极好.   作者本人经常在StackOverflow上回答一个关系Spark架构的问题,发现整个互联网都没有一篇文章能对Spark总体架构进行很好的描述, ...

  3. 李洪强iOS经典面试题139-Swift

    李洪强iOS经典面试题139-Swift Swift 网上有很多Swift的语法题,但是Swift现在语法还未稳定,所以在这里暂时不贴出语法题,可以自行搜索. Swift和Objective-C的联系 ...

  4. 下载php扩展笔记

    查找相关php的扩展网址https://pecl.php.net/index.php PECL 的全称是 The PHP Extension Community Library ,即PHP 扩展库.是 ...

  5. Unity3D优化总结(一)

    1.如使用碰撞器,简单的模型尽量使用自带的碰撞器如BoxCollider,少使用Mesh Collider. 2.如要使用Mesh Collider,可以做一个专用的模型(尽量少网格)做为Mesh C ...

  6. InnoDB与Myisam的六大区别

    MyISAM     InnoDB   构成上的区别:   每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为. ...

  7. python中matplotlib画折线图实例(坐标轴数字、字符串混搭及标题中文显示)

    最近在用python中的matplotlib画折线图,遇到了坐标轴 "数字+刻度" 混合显示.标题中文显示.批量处理等诸多问题.通过学习解决了,来记录下.如有错误或不足之处,望请指 ...

  8. Maven的依赖和传递性质

    1. 引入项目所需jar包 Maven项目直白的一大特点就是一般情况下不需要去自行下载jar包以及目标jar包的依赖包并导入,只需要在去Maven的中央仓库http://mvnrepository.c ...

  9. Oracle 语法

    1.行转列函数 11gR2以前: WM_CONCAT函数, 使用方式形如: SELECT SUS_SNO,WM_CONCAT(SRC_FILENAME) AS AAA FROM AML_SUS_TRD ...

  10. Activiti-explorer 在tomcat中部署报HTTP Status 404问题

    如果tomcat版本没错,请检查一下文件,将Activiti中war文件夹中的内容复制到webapp下,而不是将文件夹整个放进去……