[转]如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?
如何利用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.1245 , 577.90 )); Log.w(TAG, "load native so file, pow return: " + UtilsJNILib.pow( 2 , 13 )); Log.w(TAG, "load native so file, pow return: " + UtilsJNILib.div( 21.456 , 0 )); } @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库的调用堆栈【代码示例】?的更多相关文章
- 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...
- Android NDK学习(五):Java调用Native代码流程总结
编写一个Java类,并且在某个方法签名的修饰符中加上native修饰符. 使用Javac命令编译第一步中的Java类,使之成为一个class文件. 使用Javah -jni 包名.类名 生成Jni接口 ...
- Python-气象-大气科学-可视化绘图系列(二)——利用basemap叠加地图,并添加白化效果(代码+示例)
本文为原创链接: https:////www.cnblogs.com/zhanling/p/12193031.html 白化单图代码: import numpy as np import xarray ...
- jstack工具查看系统线程问题
背景: 最近在做项目系统的异常测试,项目依赖于nkv,需要模拟依赖组件nkv异常时系统的响应及性能情况.通过tc工具模拟当服务器发送到nkv的请求超时时系统的响应.发现接口返回错误率100%,查看服务 ...
- java命令--jstack 工具 查看JVM堆栈信息
介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...
- Windbg查看调用堆栈(k*)
无论是分析程序崩溃原因,还是解决程序hang问题,我们最常查看的就是程序调用堆栈.学会windbg调用堆栈命令,以及理解堆栈中的各个参数的意义就显得至关重要. 上图就是一个典型的Win ...
- Android(java)学习笔记257:JNI之helloword案例(利用NDK工具)
1.逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们要 ...
- Android(java)学习笔记201:JNI之helloword案例(利用NDK工具)
1. 逻辑思路过程图: 2.下面通过一个HelloWorld案例来说明一下JNI利用NDK开发过程(步骤) 分析:我们在Win7系统下编译的C语言代码,我们知道C语言依赖操作系统,不能跨平台,所以我们 ...
- C++ //继承中的对象模型 //利用开发人员命令提示工具查看对象模型 //父类中所有非静态成员属性都会被 子类继承下去 //父类中私有成员属性 是被编译器给隐藏了 因此是访问不到 但是确实被继承下去了
1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 /* 9 #include &l ...
随机推荐
- Service Discovery with Apache Curator
Curator的介绍 Curator就是Zookeeper的一个客户端工具(不知道Zookeeper的同学可以到http://www.ibm.com/developerworks/cn/opensou ...
- iOS小技巧 - 和屏幕等宽的Table分割线
前言 因为本人也是学习iOS才一个多月,在写程序的过程中经常会遇到一些看似应该很简单,但是要解决好却要知道一点小trick的问题. 因此后面会陆续记一些这类问题,一来加深印象,二来也可以做个备忘录. ...
- java学习系列(一)Java中的IO操作
Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入\输出操作,在Java中把不同的输入\输出源抽象为"流",通过流的方式允许Java程序使用相同的方式来访问不同的输 ...
- Linux Centos 怎么安装更新根证书实现支持https访问
其实很简单就是一个命令: mozroots --import --ask-remove 或者使用: sudo update-ca-certificates
- ASP.NET缓存全解析6:数据库缓存依赖 转自网络原文作者李天平
更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实现部分数据缓存功能.但问题是我们的数据有时候是在变化的,这样用户可能在缓存期间查询的数据 ...
- Android点击其他任意位置收起软键盘
在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些 ...
- iOS使用keychain存储密码
iOS设备中的Keychain是一个安全的存储容器.通常情况下,可以用NSUserDefaults存储数据信息,但是对于一些私密信息,比如账号.密码等等,就需要使用更为安全的keychain了.苹果自 ...
- 【学习笔记】【C语言】循环结构-do while
用法: while (条件) { } do { } while(条件); while和do-while的区别 1.很多情况下,while和do while可以互换 2.while特 ...
- PropertyGrid排序
解决PropertyGrid对自定义属性排序的问题. 参考了:http://www.cnblogs.com/greatverve/archive/2012/02/08/propergrid-order ...
- 何为BFC
BFC 定义 BFC(Block formatting context)直译为"块级格式化上下⽂文".它是⼀一个独⽴立的渲染区域,只有Block-level box参 与, 它规定 ...