利用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. bigint数据类型

    尽管int依然是SQL Server 2000中最主要的整数数据类型,但是SQL Server 2000还是新增加了整数数据类型bigint,它应用于整数超过int数据范围的场合. int数据类型所表 ...

  2. php正则获取html图片标签信息(采集图片)

    php获取html图片标签信息(采集图片),实现图片采集及其他功能,带代码如下: <?php $str="<img src='./a.jpg'/>111111<img ...

  3. 【超级干货】手机移动端WEB资源整合

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-wid ...

  4. workspace路径有中文情况会报java.net.MalformedURLException: unknown protocol: d错误

    原因及描述:java读取xml文件时如果出现中文字符就会出现这类错误 解决方法:   1.将中文路径改为英文路径 2.读取file时"file:///d:/" 而不是"d ...

  5. Git系列教程一 入门与简介

    一.版本控制引入 可能我们都会有这样的经历:创建了一个文件,并对它做了多次更改,当我们想回到其中的某一次更改的时候,由于时间太长记不得那次更改的内容,于是我们在每次大的更改的时候,会创建一个文件的副本 ...

  6. Cross join in excel --- Copy from Internet

    Set up the Workbook In this example, there are two tables -- Raw Materials and Packaging -- and each ...

  7. SQL PRIMARY KEY 约束\SQL FOREIGN KEY 约束\SQL CHECK 约束

    SQL PRIMARY KEY 约束 PRIMARY KEY 约束唯一标识数据库表中的每条记录. 主键必须包含唯一的值. 主键列不能包含 NULL 值. 每个表都应该有一个主键,并且每个表只能有一个主 ...

  8. iOS 10的正确解锁方式

    在iOS 10上,锁屏状态通过按下电源键点亮屏幕之后,用手指轻触Home键,实际上手机是已经解锁了的,不信请看如下截图: 虽然手机已经解锁,但与iOS 9不同的是,此时手机还处在解锁界面而没有进入主屏 ...

  9. python 的var_dump

    from __future__ import print_function from types import NoneType __author__ = "Shamim Hasnath&q ...

  10. web前端开发培训和自学 哪种选择更适合你

    web前端相对于其他软件开发是比较容易入门的,但是如果深入学习就比较困难了,这门技能需要从业人员掌握一定的设计.代码.交互技能和一些SEO技能,容易入门还涉及这么多知识和技能,那学习web前端开发到底 ...