`
aigo
  • 浏览: 2680900 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

【Android ndk-stack tool】用ndk-stack分析应用native程序异常crash掉

 
阅读更多

Android ndk-stack tool

----------------------

 

Introduction:

-------------

 

This document describes the 'ndk-stack' tool that is distributed with

the Android NDK, since release r6.

 

Overview:

---------

 

'ndk-stack' is a simple tool that allows you to filter stack traces as they

appear in the output of 'adb logcat' and replace any address inside a shared

library with the corresponding <source-file>

:

<line-number>

 values.

 

In a nutshell, it will translate something like:

 

    I/DEBUG   (   31): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

    I/DEBUG   (   31): Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'

    I/DEBUG   (   31): pid: 351, tid: 351  %gt;%gt;%gt; /data/local/ndk-tests/crasher <<<

    I/DEBUG   (   31): signal 11 (SIGSEGV), fault addr 0d9f00d8

    I/DEBUG   (   31):  r0 0000af88  r1 0000a008  r2 baadf00d  r3 0d9f00d8

    I/DEBUG   (   31):  r4 00000004  r5 0000a008  r6 0000af88  r7 00013c44

    I/DEBUG   (   31):  r8 00000000  r9 00000000  10 00000000  fp 00000000

    I/DEBUG   (   31):  ip 0000959c  sp be956cc8  lr 00008403  pc 0000841e  cpsr 60000030

    I/DEBUG   (   31):          #00  pc 0000841e  /data/local/ndk-tests/crasher

    I/DEBUG   (   31):          #01  pc 000083fe  /data/local/ndk-tests/crasher

    I/DEBUG   (   31):          #02  pc 000083f6  /data/local/ndk-tests/crasher

    I/DEBUG   (   31):          #03  pc 000191ac  /system/lib/libc.so

    I/DEBUG   (   31):          #04  pc 000083ea  /data/local/ndk-tests/crasher

    I/DEBUG   (   31):          #05  pc 00008458  /data/local/ndk-tests/crasher

    I/DEBUG   (   31):          #06  pc 0000d362  /system/lib/libc.so

    I/DEBUG   (   31):

 

Into the more readable output:

 

    ********** Crash dump: **********

    Build fingerprint: 'generic/google_sdk/generic/:2.2/FRF91/43546:eng/test-keys'

    pid: 351, tid: 351  >>> /data/local/ndk-tests/crasher <<<

    signal 11 (SIGSEGV), fault addr 0d9f00d8

    Stack frame #00  pc 0000841e  /data/local/ndk-tests/crasher : Routine zoo in /tmp/foo/crasher/jni/zoo.c:13

    Stack frame #01  pc 000083fe  /data/local/ndk-tests/crasher : Routine bar in /tmp/foo/crasher/jni/bar.c:5

    Stack frame #02  pc 000083f6  /data/local/ndk-tests/crasher : Routine my_comparison in /tmp/foo/crasher/jni/foo.c:9

    Stack frame #03  pc 000191ac  /system/lib/libc.so

    Stack frame #04  pc 000083ea  /data/local/ndk-tests/crasher : Routine foo in /tmp/foo/crasher/jni/foo.c:14

    Stack frame #05  pc 00008458  /data/local/ndk-tests/crasher : Routine main in /tmp/foo/crasher/jni/main.c:19

    Stack frame #06  pc 0000d362  /system/lib/libc.so

 

Usage:

------

 

To do this, you will first need a directory containing symbolic versions of your

application's shared libraries. If you use the NDK build system (i.e. ndk-build),

then these are always located under $PROJECT_PATH/obj/local/<ab>, where

<ab> stands for your device's ABI (i.e. 'armeabi' by default).

 

You can feed the logcat text either as direct input to the program, e.g.:

 

   adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi

 

Or you can use the -dump option to specify the logcat as an input file, e.g.:

 

   adb logcat > /tmp/foo.txt

   $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump foo.txt

 

 

** IMPORTANT **:

 

  The tool looks for the initial line containing starts in the logcat output,

  i.e. something that looks like:

 

    *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

 

  When copy/pasting traces, don't forget this line from the traces, or

  ndk-stack won't work correctly.

 

TODO:

-----

 

A future version of 'ndk-stack' will try to launch 'adb logcat' and select the

library path automatically. For now, you'll have to do these steps manually.

 

As of now, ndk-stack doesn't handle libraries that don't have debug information

in them. It may be useful to try to detect the nearest function entry point to

a given PC address (e.g. as in the libc.so example above).

分享到:
评论

相关推荐

    android ndk-stack使用说明。

    ### Android NDK-Stack 使用说明 #### 一、概述 在使用Cocos2d-x、JNI及Android NDK进行开发时,经常会遇到调试困难的问题。尤其是对于C/C++代码的调试,由于涉及到本地代码与Java层之间的交互,使得调试过程变得...

    ndk-stack调试 cocos2d-x

    ndk-stack 是 Android NDK 中的一个命令行工具,用于分析和调试Native 代码。它可以将崩溃的日志信息转换成可读的调用栈信息,从而帮助开发者快速定位和解决问题。 ndk-stack 的使用方法 在使用 ndk-stack 之前,...

    android-ndk-tracktrack-analyzer .py

    在Android开发中,"tracktrack"通常指的是追踪和分析应用运行过程中的特定事件,如内存分配、CPU使用率或异常情况。"android-ndk-tracktrack-analyzer.py"就是这样一个工具,它能解析由NDK生成的跟踪日志,从而帮助...

    android-ndk(android-ndk-r26b-linux.zip)

    Android NDK,全称为Native Development Kit,是Google提供的一款用于Android平台的开发工具,它允许开发者使用C++和其他原生编程语言编写应用的部分或全部代码。这个“android-ndk-r26b-linux.zip”文件是NDK的一个...

    android-ndk-r8dab.zip_NDK_android_android ndk

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用工具,它允许开发者使用C和C++编写部分应用代码,以利用设备的硬件性能或实现更底层的操作。在“android-ndk-r8dab....

    android Ndk开发用例

    Android NDK(Native Development Kit)是Google为Android平台提供的一套工具集,允许开发者使用C、C++等原生代码来编写部分应用模块,从而提高应用程序的性能和效率。JNI(Java Native Interface)是Java平台的标准...

    Android NDK开发Crash错误定位

    Android NDK(Native Development Kit)是用于开发Android应用中的本地部分(如C或C++代码)的一个工具集。在Android应用开发过程中,程序崩溃(Crash)是一个常见的问题,它影响用户体验,并给开发者带来调试的挑战...

    Android native code crash分析工具stack

    一个用于分析Android本地代码crash的工具 出现crash以后,用logcat -s DEBUG把crash的log打印保存下来,例如crash_log.txt; 然后执行 ndk-stack -sym 符号所在的目录 -dump crash_log.txt; 例如ndk-stack -sym out/...

    android-ndk-r11c-windows-x86-64-zip.rar

    Android NDK(Native Development Kit)是Google推出的一款用于在Android平台上进行原生代码开发的工具集,它允许开发者使用C++和其他本地语言编写高性能、低级别的应用程序组件。在Android应用开发中,NDK扮演着至...

    CC2530NDK.rar_Z-STACK SensorDemo

    《CC2530NDK.rar_Z-STACK SensorDemo》是一个关于无线传感器网络开发的实践教程,主要基于CC2530芯片和Z-STACK协议栈。CC2530是一款由Texas Instruments(TI)公司生产的高效能、低功耗的微控制器,广泛应用于无线...

    查找android crash堆栈中的C++代码位置的工具

    总结来说,处理Android应用中的C++崩溃问题,关键在于正确使用`ndk-stack`工具解析crash堆栈,结合`mapping.txt`文件将地址转换为源代码位置。通过这种方式,开发者可以迅速定位到问题的根源,提高故障排查的效率。...

    Android ndk

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用工具集。它允许开发者在Android应用中使用C和C++代码,从而实现高性能计算、图形处理或者利用已有的C/C++库。这篇入门...

    android_NDK.rar_NDK_android_android ndk_linux android

    - **性能分析**:使用Android Profiler和NDK提供的工具,如`ndk-stack`,可以对本地代码进行性能分析和错误排查。 5. **最佳实践** - **最小化本地代码**:只在必要时使用NDK,因为本地代码更难调试且不支持动态...

    android NDK 安装必备 Cygwin

    Android NDK(Native Development Kit)是Google为Android平台提供的一款用于开发原生代码的应用程序工具集,它允许开发者使用C和C++等低级语言编写性能敏感或需要访问硬件的代码。在Android应用开发中,NDK常用于...

    Android NDK 一

    - **定义**:Android NDK (Native Development Kit) 是一套工具集,它提供了必要的工具和文档来帮助开发者使用 C 或 C++ 编写原生应用层代码。尽管 Java 仍然是 Android 应用开发的主要语言,但 NDK 提供了额外的...

    Android下各语言加callStack示例

    在Android系统中,理解和分析调用堆栈(call stack)对于开发者来说至关重要,尤其是在调试和性能优化时。本文将深入探讨如何在Android环境下为不同语言(C语言、C++、Java以及内核空间)添加并打印调用堆栈信息。 ...

    boost移植到安卓的方式

    将 Boost 移植到 Android 平台可以让开发者在 Android 应用程序中利用这些强大的功能。下面我们将详细介绍如何在 Ubuntu 操作系统下使用 arm-linux-gcc 编译 Boost 1.5.1 版本,以便在 Android 设备上使用。 **目的...

    Android NDK *** could not be resolved

    NDK(Native Development Kit)是Google提供的一套工具,用于在Android应用中进行C/C++原生代码的开发,它允许开发者利用高性能的原生代码来实现特定功能,例如图形处理、物理模拟等。 首先,我们需要了解NDK的安装...

    Android Studio JNI_NDK开发实例

    Android Studio JNI_NDK开发实例是Android应用开发中的一个重要领域,涉及到Java与原生代码(C/C++)的交互。JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。NDK...

Global site tag (gtag.js) - Google Analytics