如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?

http://hi.baidu.com/subo4110/item/d00395b3bf63e4432bebe36d

Step1:Android应用主文件:CPPTestActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.subo4110.cpptest;
          
          
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
          
public class CPPTestActivity extends Activity {
          
    private static final String TAG = "CPPTestActivity";
              
              
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cpptest);
                  
        Log.w(TAG, "load native so file, add return: " + UtilsJNILib.add(193.1245577.90));
        Log.w(TAG, "load native so file, pow return: " + UtilsJNILib.pow(213));
        Log.w(TAG, "load native so file, pow return: " + UtilsJNILib.div(21.4560));
                  
    }
          
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.cpptest, menu);
        return true;
    }
          
}

Step2:定义native接口的java类:UtilsJNILib.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.subo4110.cpptest;
         
public class UtilsJNILib {
         
    static {
                 
        System.loadLibrary("UtilsJNILib");
                 
    }
             
    public static native double add(double a, double b);
    public static native double pow(double a, double b);
    public static native double div(double a, double b);
             
}

Step3:调用JNI命令并实现JNI接口的C++类:UtilsJNILib.cpp,具体的JNI命令为:javah -jni com.subo4110.cpptest.UtilsJNILib

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <jni.h>
#include <android/log.h>
         
#include <math.h>
         
#define  LOG_TAG    "UtilsJNILib"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
         
         
extern "C" {
         
    jint JNI_OnLoad(JavaVM *vm, void *reserved)
    {
        LOGI("JNI_OnLoad");
         
        return JNI_VERSION_1_4;
    }
         
         
    /*
     * Class:     com_subo4110_cpptest_UtilsJNILib
     * Method:    nativeAdd
     * Signature: (DD)D
     */
    JNIEXPORT jdouble JNICALL Java_com_subo4110_cpptest_UtilsJNILib_add
        (JNIEnv *env, jclass obj, jdouble a, jdouble b)
    {
        return (a+b);
    }
         
         
    /*
     * Class:     com_subo4110_cpptest_UtilsJNILib
     * Method:    pow
     * Signature: (DD)D
     */
    JNIEXPORT jdouble JNICALL Java_com_subo4110_cpptest_UtilsJNILib_pow
      (JNIEnv *env, jclass obj, jdouble a, jdouble b)
    {
        return pow(a, b);
    }
         
         
    /*
     * Class:     com_subo4110_cpptest_UtilsJNILib
     * Method:    div
     * Signature: (DD)D
     */
    JNIEXPORT jdouble JNICALL Java_com_subo4110_cpptest_UtilsJNILib_div
      (JNIEnv *env, jclass obj, jdouble a, jdouble b)
    {
        char* buf = 0;
        buf[1] = 'a';//此处将报错,Fatal Signal 11。。。
        return a/b;
    }
         
};

Step4:用来ndk-build的make文件:Android.mk

1
2
3
4
5
6
7
8
9
10
11
LOCAL_PATH := $(call my-dir)
        
include $(CLEAR_VARS)
        
LOCAL_LDLIBS := -llog
        
LOCAL_MODULE := UtilsJNILib
        
LOCAL_SRC_FILES := UtilsJNILib.cpp
        
include $(BUILD_SHARED_LIBRARY)

Step5:运行后,将在Eclipse的logcat窗口看到如下log信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
05-08 16:45:56.800: E/Trace(12735): error opening trace file: No such file or directory (2)
05-08 16:45:56.800: D/ActivityThread(12735): setTargetHeapUtilization:0.25
05-08 16:45:56.800: D/ActivityThread(12735): setTargetHeapIdealFree:8388608
05-08 16:45:56.800: D/ActivityThread(12735): setTargetHeapConcurrentStart:2097152
05-08 16:45:57.000: W/ResourceType(12735): No package identifier when getting value for resource number 0x00000000
05-08 16:45:57.000: W/PackageManager(12735): Failure retrieving resources forcom.subo4110.cpptest: Resource ID #0x0
05-08 16:45:57.030: D/IconCustomizer(12735): Generate customized icon for com.subo4110.cpptest.png
05-08 16:45:57.030: W/IconCustomizer(12735): can't load transform_config.xml
05-08 16:45:57.100: I/themeservice(12735): add pending job /data/data/com.subo4110.cpptest/cache/com.subo4110.cpptest.png
05-08 16:45:57.120: I/themeservice(12735): binding service
05-08 16:45:57.130: I/UtilsJNILib(12735): JNI_OnLoad
05-08 16:45:57.130: W/CPPTestActivity(12735): load native so file, add return: 771.0245
05-08 16:45:57.130: W/CPPTestActivity(12735): load native so file, pow return: 8192.0
05-08 16:45:57.130: A/libc(12735): Fatal signal 11 (SIGSEGV) at 0x00000001 (code=1), thread 12735 (ubo4110.cpptest)

Step6:在cmd中输入命令:adb logcat | ndk-stack -sym D:\workspace\Android\MyOwnSamples\JNICPPTest\obj\local\armeabi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
C:\Users\yongle.liu>adb logcat | ndk-stack -sym D:\workspace\Android\MyOwnSamples\JNICPPTest\obj\local\armeabi
********** Crash dump: **********
Build fingerprint: 'unknown'
pid: 4079, tid: 4095  >>> com.mobinex.service:TeliDHService <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 03f9b848
Stack frame #00  pc 00019012  /system/lib/libutils.so (_ZNK7android7RefBase9decStrongEPKv)
Stack frame #01  pc 00010930  /system/lib/libcamera_client.so (_ZN7android2spINS_7ICameraEED1Ev)
Stack frame #02  pc 00010d82  /system/lib/libcamera_client.so (_ZN7android6CameraD1Ev)
Stack frame #03  pc 00010de8  /system/lib/libcamera_client.so (_ZN7android6CameraD0Ev)
Stack frame #04  pc 000118f2  /system/lib/libcamera_client.so (_ZTv0_n12_N7android6CameraD0Ev)
Stack frame #05  pc 00019038  /system/lib/libutils.so (_ZNK7android7RefBase9decStrongEPKv)
Stack frame #06  pc 00017398  /system/lib/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb)
Stack frame #07  pc 0001c668  /system/lib/libbinder.so
Stack frame #08  pc 00020156  /system/lib/libutils.so (_ZN7android6Thread11_threadLoopEPv)
Stack frame #09  pc 00096260  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv)
Stack frame #10  pc 0002079c  /system/lib/libutils.so
Stack frame #11  pc 00012134  /system/lib/libc.so (__thread_entry)
Stack frame #12  pc 00011c88  /system/lib/libc.so (pthread_create)
Crash dump is completed
      
********** Crash dump: **********
Build fingerprint: 'unknown'
pid: 4201, tid: 4201  >>> com.subo4110.cpptest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000001
Stack frame #00  pc 00000fee  /data/data/com.subo4110.cpptest/lib/libUtilsJNILib.so (Java_com_subo4110_cpptest_UtilsJNILib_div): Routine Java_com_subo4110_cpptest_UtilsJNILib_div in jni/UtilsJNILib.cp
p:54
Stack frame #01  pc 00018c30  /system/lib/libdvm.so (dvmPlatformInvoke)
Stack frame #02  pc 00053146  /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #03  pc 00046c44  /system/lib/libdvm.so (_Z21dvmCheckCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #04  pc 00054e74  /system/lib/libdvm.so (_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #05  pc 0002aa4c  /system/lib/libdvm.so
Stack frame #06  pc 0002e1fc  /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stack frame #07  pc 00066832  /system/lib/libdvm.so (_Z15dvmInvokeMethodP6ObjectPK6MethodP11ArrayObjectS5_P11ClassObjectb)
Stack frame #08  pc 0006dc62  /system/lib/libdvm.so
Stack frame #09  pc 00054e74  /system/lib/libdvm.so (_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #10  pc 0002aa4c  /system/lib/libdvm.so
Stack frame #11  pc 0002e1fc  /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stack frame #12  pc 00066b02  /system/lib/libdvm.so (_Z14dvmCallMethodVP6ThreadPK6MethodP6ObjectbP6JValueSt9__va_list)
Stack frame #13  pc 0004f19a  /system/lib/libdvm.so
Stack frame #14  pc 00043b20  /system/lib/libdvm.so
Stack frame #15  pc 000962fe  /system/lib/libandroid_runtime.so
Stack frame #16  pc 00096e66  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcS2_)
Stack frame #17  pc 00008f0e  /system/bin/app_process
Stack frame #18  pc 00015a34  /system/lib/libc.so (__libc_init)
Crash dump is completed
      
********** Crash dump: **********
Build fingerprint: 'unknown'
pid: 4309, tid: 4309  >>> com.subo4110.cpptest <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000001
Stack frame #00  pc 00000fee  /data/data/com.subo4110.cpptest/lib/libUtilsJNILib.so (Java_com_subo4110_cpptest_UtilsJNILib_div): Routine Java_com_subo4110_cpptest_UtilsJNILib_div in jni/UtilsJNILib.cp
p:54
Stack frame #01  pc 00018c30  /system/lib/libdvm.so (dvmPlatformInvoke)
Stack frame #02  pc 00053146  /system/lib/libdvm.so (_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #03  pc 00046c44  /system/lib/libdvm.so (_Z21dvmCheckCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #04  pc 00054e74  /system/lib/libdvm.so (_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #05  pc 0002aa4c  /system/lib/libdvm.so
Stack frame #06  pc 0002e1fc  /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stack frame #07  pc 00066832  /system/lib/libdvm.so (_Z15dvmInvokeMethodP6ObjectPK6MethodP11ArrayObjectS5_P11ClassObjectb)
Stack frame #08  pc 0006dc62  /system/lib/libdvm.so
Stack frame #09  pc 00054e74  /system/lib/libdvm.so (_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stack frame #10  pc 0002aa4c  /system/lib/libdvm.so
Stack frame #11  pc 0002e1fc  /system/lib/libdvm.so (_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stack frame #12  pc 00066b02  /system/lib/libdvm.so (_Z14dvmCallMethodVP6ThreadPK6MethodP6ObjectbP6JValueSt9__va_list)
Stack frame #13  pc 0004f19a  /system/lib/libdvm.so
Stack frame #14  pc 00043b20  /system/lib/libdvm.so
Stack frame #15  pc 000962fe  /system/lib/libandroid_runtime.so
Stack frame #16  pc 00096e66  /system/lib/libandroid_runtime.so (_ZN7android14AndroidRuntime5startEPKcS2_)
Stack frame #17  pc 00008f0e  /system/bin/app_process
Stack frame #18  pc 00015a34  /system/lib/libc.so (__libc_init)
      
C:\Users\yongle.liu>

Step7:堆栈中最后2个里面,可以找到signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000001,而这个地址与Eclipse的logcat的log信息中的错误地址一样。那么你就可以开始找错误啦!

参考资料:http://www.cocos2d-x.org/boards/6/topics/13392?r=13472

但是,我还没有找到如何查看多个so库有链接关系的情况,如何利用ndk-stack查看堆栈?望高手指点!

[转]如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?的更多相关文章

  1. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  2. Android NDK学习(五):Java调用Native代码流程总结

    编写一个Java类,并且在某个方法签名的修饰符中加上native修饰符. 使用Javac命令编译第一步中的Java类,使之成为一个class文件. 使用Javah -jni 包名.类名 生成Jni接口 ...

  3. Python-气象-大气科学-可视化绘图系列(二)——利用basemap叠加地图,并添加白化效果(代码+示例)

    本文为原创链接: https:////www.cnblogs.com/zhanling/p/12193031.html 白化单图代码: import numpy as np import xarray ...

  4. jstack工具查看系统线程问题

    背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...

  5. java命令--jstack 工具 查看JVM堆栈信息

    介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...

  6. Windbg查看调用堆栈(k*)

            无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈.学会windbg调用堆栈命令,以及理解堆栈中的各个参数的意义就显得至关重要. 上图就是一个典型的Win ...

  7. Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)

    1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...

  8. Android(java)学习笔记201:JNI之helloword案例(利用NDK工具)

    1. 逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们 ...

  9. C++ //继承中的对象模型 //利用开发人员命令提示工具查看对象模型 //父类中所有非静态成员属性都会被 子类继承下去 //父类中私有成员属性 是被编译器给隐藏了 因此是访问不到 但是确实被继承下去了

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 /* 9 #include &l ...

随机推荐

  1. Python执行系统命令的方法

    Python中执行系统命令常见方法有两种: 两者均需 import os (1) os.system # 仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 system(command) ...

  2. Differential Geometry之第五章曲面的内蕴几何学

    第五章.曲面的内蕴几何学 1.曲面的等距变换 2.曲面的协变微分 协变微分: 3.测地曲率与测地线 4.测地坐标系 4.1.测地平行坐标系 4.2.测地极坐标系和法坐标系 5.Gauss-Bonnet ...

  3. 话说Centos下nginx,php,mysql以及phpmyadmin的配置

    大话centos下部署phalcon框架 Centos还是ubuntu? 当我沿用这个标题的时候,心里在想"我能说我之前用的windows吗?",windows下xampp,wam ...

  4. Table of Contents - Tomcat

    Manager 持久化 Session JNDI Resources JNDI 配置 JDBC DataSources DBCP 配置 Realm Configuration 设置 HTTP 基本认证 ...

  5. SQL Server高级内容之子查询和表链接

    1.子查询概念 (1)就是在查询的where子句中的判断依据是另一个查询的结果,如此就构成了一个外部的查询和一个内部的查询,这个内部的查询就是自查询. (2)自查询的分类 1)独立子查询 ->独 ...

  6. Javascript验证用户输入URL地址是否正确

    <script type="text/javascript">function checkUrl() { var url = document.getElementBy ...

  7. linux中利用iptables+geoip过滤指定IP

    1. 前提条件 iptables >= 1.4.5 kernel-devel >= 3.7 2.  安装依赖包  代码如下 复制代码 # yum install gcc gcc-c++ m ...

  8. 【SNMP】SNMP概述

    SNMP概述 SNMP(Simple Network Management Protocol,简单网络管理协议)是目前UDP/IP网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维护互联 ...

  9. Objective-C 【protocol-协议 的了解使用】

    ------------------------------------------- protocol(协议) (1)引文:OC中的protocol和Java中的接口(interface)比较类似, ...

  10. WCF之服务元数据

    服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点 ...