利用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. C# ArrayList的用法

    System.Collections.ArrayList类是一个特殊的数组.通过添加和删除元素,就可以动态改变数组的长度. 一.优点 1. 支持自动改变大小的功能 2. 可以灵活的插入元素 3. 可以 ...

  2. java分享第七天-02(读取文件)

    一 读取文件 public static void main(String[] args) throws FileNotFoundException, IOException { // 建立File对 ...

  3. Python实战:扫描key完整性

    之前在国际版本中,需要支持中英文切换功能,在如此繁多的源文件里要查找源文件里的key是语言资源包是否对应. 正好运用在之前学的python,写了个工具,支持自定义替换标签,批量处理源文件.现在看来,效 ...

  4. Cookie案例:简单登录界面中的应用

    ServletDemo1.java package ztq.servlet.study; import java.io.IOException; import java.io.PrintWriter; ...

  5. JavaScript、tabel切换完整版—自动切换—鼠标移入停止-移开运行

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Lua数据持久化

      1.数据文件 我们可以利用Lua中的table构造式来定义一种文件格式,即文件中的数据是table构造并初始化的代码 ,这种方式对于Lua程序而言是非常方便和清晰的,如: Entry{" ...

  7. Cannot instantiate the type AppiumDriver

    I have added following jars in my projects build path: java-client-2.0.0 from http://appium.io/downl ...

  8. javascript入门:prototype和面向对象的实现

    由于工作需要,需要大量使用javascript,于是对其进行了一下学习. 学习任何一个语言,最重要的是掌握其和其他语言不同的关键特性.对javascript来说,我总结就是prototype.就像me ...

  9. Codeforces554B:Ohana Cleans Up

    B. Ohana Cleans Up Time Limit: 2000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d      Ja ...

  10. server与Portal联合,portal许可过期无法登录。

    server与Portal联合,portal许可过期无法登录,怎样解除联合. 解决方案由峥姐友情提供~~ (1)删除有两种方式(①/②选其一即可): ①类似 链接ttps://sunl.esrichi ...