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

摘要:
如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?http://hi.baidu.com/subo4110/item/d00395b3bf63e4432bebe36dStep1:Android应用主文件:CPPTestActivity.java1234567891011121314151617181920212223242526272829303132packagecom.subo4

如何利用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
packagecom.subo4110.cpptest;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.util.Log;
importandroid.view.Menu;
publicclassCPPTestActivityextendsActivity{
privatestaticfinalStringTAG="CPPTestActivity";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cpptest);
Log.w(TAG,"loadnativesofile,addreturn:"+UtilsJNILib.add(193.1245,577.90));
Log.w(TAG,"loadnativesofile,powreturn:"+UtilsJNILib.pow(2,13));
Log.w(TAG,"loadnativesofile,powreturn:"+UtilsJNILib.div(21.456,0));
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.cpptest,menu);
returntrue;
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
packagecom.subo4110.cpptest;
publicclassUtilsJNILib{
static{
System.loadLibrary("UtilsJNILib");
}
publicstaticnativedoubleadd(doublea,doubleb);
publicstaticnativedoublepow(doublea,doubleb);
publicstaticnativedoublediv(doublea,doubleb);
}

Step3:调用JNI命令并实现JNI接口的C++类:UtilsJNILib.cpp,具体的JNI命令为:javah-jnicom.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>
#defineLOG_TAG"UtilsJNILib"
#defineLOGI(...)__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#defineLOGE(...)__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
extern"C"{
jintJNI_OnLoad(JavaVM*vm,void*reserved)
{
LOGI("JNI_OnLoad");
returnJNI_VERSION_1_4;
}
/*
*Class:com_subo4110_cpptest_UtilsJNILib
*Method:nativeAdd
*Signature:(DD)D
*/
JNIEXPORTjdoubleJNICALLJava_com_subo4110_cpptest_UtilsJNILib_add
(JNIEnv*env,jclassobj,jdoublea,jdoubleb)
{
return(a+b);
}
/*
*Class:com_subo4110_cpptest_UtilsJNILib
*Method:pow
*Signature:(DD)D
*/
JNIEXPORTjdoubleJNICALLJava_com_subo4110_cpptest_UtilsJNILib_pow
(JNIEnv*env,jclassobj,jdoublea,jdoubleb)
{
returnpow(a,b);
}
/*
*Class:com_subo4110_cpptest_UtilsJNILib
*Method:div
*Signature:(DD)D
*/
JNIEXPORTjdoubleJNICALLJava_com_subo4110_cpptest_UtilsJNILib_div
(JNIEnv*env,jclassobj,jdoublea,jdoubleb)
{
char*buf=0;
buf[1]='a';//此处将报错,FatalSignal11。。。
returna/b;
}
};

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

1
2
3
4
5
6
7
8
9
10
11
LOCAL_PATH:=$(callmy-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-0816:45:56.800:E/Trace(12735):erroropeningtracefile:Nosuchfileordirectory(2)
05-0816:45:56.800:D/ActivityThread(12735):setTargetHeapUtilization:0.25
05-0816:45:56.800:D/ActivityThread(12735):setTargetHeapIdealFree:8388608
05-0816:45:56.800:D/ActivityThread(12735):setTargetHeapConcurrentStart:2097152
05-0816:45:57.000:W/ResourceType(12735):Nopackageidentifierwhengettingvalueforresourcenumber0x00000000
05-0816:45:57.000:W/PackageManager(12735):Failureretrievingresourcesforcom.subo4110.cpptest:ResourceID#0x0
05-0816:45:57.030:D/IconCustomizer(12735):Generatecustomizediconforcom.subo4110.cpptest.png
05-0816:45:57.030:W/IconCustomizer(12735):can'tloadtransform_config.xml
05-0816:45:57.100:I/themeservice(12735):addpendingjob/data/data/com.subo4110.cpptest/cache/com.subo4110.cpptest.png
05-0816:45:57.120:I/themeservice(12735):bindingservice
05-0816:45:57.130:I/UtilsJNILib(12735):JNI_OnLoad
05-0816:45:57.130:W/CPPTestActivity(12735):loadnativesofile,addreturn:771.0245
05-0816:45:57.130:W/CPPTestActivity(12735):loadnativesofile,powreturn:8192.0
05-0816:45:57.130:A/libc(12735):Fatalsignal11(SIGSEGV)at0x00000001(code=1),thread12735(ubo4110.cpptest)

Step6:在cmd中输入命令:adblogcat|ndk-stack-symD:workspaceAndroidMyOwnSamplesJNICPPTestobjlocalarmeabi

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:Usersyongle.liu>adblogcat|ndk-stack-symD:workspaceAndroidMyOwnSamplesJNICPPTestobjlocalarmeabi
**********Crashdump:**********
Buildfingerprint:'unknown'
pid:4079,tid:4095>>>com.mobinex.service:TeliDHService<<<
signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddr03f9b848
Stackframe#00pc00019012/system/lib/libutils.so(_ZNK7android7RefBase9decStrongEPKv)
Stackframe#01pc00010930/system/lib/libcamera_client.so(_ZN7android2spINS_7ICameraEED1Ev)
Stackframe#02pc00010d82/system/lib/libcamera_client.so(_ZN7android6CameraD1Ev)
Stackframe#03pc00010de8/system/lib/libcamera_client.so(_ZN7android6CameraD0Ev)
Stackframe#04pc000118f2/system/lib/libcamera_client.so(_ZTv0_n12_N7android6CameraD0Ev)
Stackframe#05pc00019038/system/lib/libutils.so(_ZNK7android7RefBase9decStrongEPKv)
Stackframe#06pc00017398/system/lib/libbinder.so(_ZN7android14IPCThreadState14joinThreadPoolEb)
Stackframe#07pc0001c668/system/lib/libbinder.so
Stackframe#08pc00020156/system/lib/libutils.so(_ZN7android6Thread11_threadLoopEPv)
Stackframe#09pc00096260/system/lib/libandroid_runtime.so(_ZN7android14AndroidRuntime15javaThreadShellEPv)
Stackframe#10pc0002079c/system/lib/libutils.so
Stackframe#11pc00012134/system/lib/libc.so(__thread_entry)
Stackframe#12pc00011c88/system/lib/libc.so(pthread_create)
Crashdumpiscompleted
**********Crashdump:**********
Buildfingerprint:'unknown'
pid:4201,tid:4201>>>com.subo4110.cpptest<<<
signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddr00000001
Stackframe#00pc00000fee/data/data/com.subo4110.cpptest/lib/libUtilsJNILib.so(Java_com_subo4110_cpptest_UtilsJNILib_div):RoutineJava_com_subo4110_cpptest_UtilsJNILib_divinjni/UtilsJNILib.cp
p:54
Stackframe#01pc00018c30/system/lib/libdvm.so(dvmPlatformInvoke)
Stackframe#02pc00053146/system/lib/libdvm.so(_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#03pc00046c44/system/lib/libdvm.so(_Z21dvmCheckCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#04pc00054e74/system/lib/libdvm.so(_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#05pc0002aa4c/system/lib/libdvm.so
Stackframe#06pc0002e1fc/system/lib/libdvm.so(_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stackframe#07pc00066832/system/lib/libdvm.so(_Z15dvmInvokeMethodP6ObjectPK6MethodP11ArrayObjectS5_P11ClassObjectb)
Stackframe#08pc0006dc62/system/lib/libdvm.so
Stackframe#09pc00054e74/system/lib/libdvm.so(_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#10pc0002aa4c/system/lib/libdvm.so
Stackframe#11pc0002e1fc/system/lib/libdvm.so(_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stackframe#12pc00066b02/system/lib/libdvm.so(_Z14dvmCallMethodVP6ThreadPK6MethodP6ObjectbP6JValueSt9__va_list)
Stackframe#13pc0004f19a/system/lib/libdvm.so
Stackframe#14pc00043b20/system/lib/libdvm.so
Stackframe#15pc000962fe/system/lib/libandroid_runtime.so
Stackframe#16pc00096e66/system/lib/libandroid_runtime.so(_ZN7android14AndroidRuntime5startEPKcS2_)
Stackframe#17pc00008f0e/system/bin/app_process
Stackframe#18pc00015a34/system/lib/libc.so(__libc_init)
Crashdumpiscompleted
**********Crashdump:**********
Buildfingerprint:'unknown'
pid:4309,tid:4309>>>com.subo4110.cpptest<<<
signal11(SIGSEGV),code1(SEGV_MAPERR),faultaddr00000001
Stackframe#00pc00000fee/data/data/com.subo4110.cpptest/lib/libUtilsJNILib.so(Java_com_subo4110_cpptest_UtilsJNILib_div):RoutineJava_com_subo4110_cpptest_UtilsJNILib_divinjni/UtilsJNILib.cp
p:54
Stackframe#01pc00018c30/system/lib/libdvm.so(dvmPlatformInvoke)
Stackframe#02pc00053146/system/lib/libdvm.so(_Z16dvmCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#03pc00046c44/system/lib/libdvm.so(_Z21dvmCheckCallJNIMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#04pc00054e74/system/lib/libdvm.so(_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#05pc0002aa4c/system/lib/libdvm.so
Stackframe#06pc0002e1fc/system/lib/libdvm.so(_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stackframe#07pc00066832/system/lib/libdvm.so(_Z15dvmInvokeMethodP6ObjectPK6MethodP11ArrayObjectS5_P11ClassObjectb)
Stackframe#08pc0006dc62/system/lib/libdvm.so
Stackframe#09pc00054e74/system/lib/libdvm.so(_Z22dvmResolveNativeMethodPKjP6JValuePK6MethodP6Thread)
Stackframe#10pc0002aa4c/system/lib/libdvm.so
Stackframe#11pc0002e1fc/system/lib/libdvm.so(_Z12dvmInterpretP6ThreadPK6MethodP6JValue)
Stackframe#12pc00066b02/system/lib/libdvm.so(_Z14dvmCallMethodVP6ThreadPK6MethodP6ObjectbP6JValueSt9__va_list)
Stackframe#13pc0004f19a/system/lib/libdvm.so
Stackframe#14pc00043b20/system/lib/libdvm.so
Stackframe#15pc000962fe/system/lib/libandroid_runtime.so
Stackframe#16pc00096e66/system/lib/libandroid_runtime.so(_ZN7android14AndroidRuntime5startEPKcS2_)
Stackframe#17pc00008f0e/system/bin/app_process
Stackframe#18pc00015a34/system/lib/libc.so(__libc_init)
C:Usersyongle.liu>

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

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

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

免责声明:文章转载自《[转]如何利用ndk-stack工具查看so库的调用堆栈【代码示例】?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇icmp 流量抓取 转发 代理(2)练习--爬取xici可用代理IP下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安装配置管理 之 JRE 安装和配置,以适合JAVA程序运行所具备的环境

作者:北南南北来自: LinuxSir.Org提要: 本文主要讲述jre的安装和配置,以适合JAVA程序的运行;本文以 jre-1_5_0_04 版本为例; +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++正文+++++++++++++++++++++++++++++...

CMD命令

最近接触了一些CMD命令相关的东西 ----------------------------------------------------------------------首先是一个不停拷贝文件的小东西 #include<windows.h>int main(){ system("mkdir new"); system("mkdir tem...

WCF NetTcpBinding 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作

背景:WindowsService + WCF + NetTcpBinding 之前一直使用http协议模式,改为net.tcp之后隔段时间出现:由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。 127.0.0.1:9000 记录时间:2016-01-14 10:02:58日志级别:Exception 日志位置:CloudTraPlatSOA....

Android内存分析工具

在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具。 文章参考: 1.dumpsys 2.memory-analysis-command 1.内存的指标 Item 全称 描述 类型 USS Unique Set Size 进程独占的内存(不包含共享库占用的内存) 物理内存 PSS P...

Linq的使用

LINQ基础介绍: 在.NET中,任何数据结构都是由在mscorlib.dll中System.Collections.Generic命名空间下的Ienumerable<T>接口得到的. 映射可以访问所有的定义在System.Core.dll中System.Linq命名空间下的枚举类.这个枚举类是定义在System.Core.dll中Syste...

oracle sql*plus常用命令

一、sys用户和system用户Oracle安装会自动的生成sys用户和system用户(1)、sys用户是超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是change_on_install(2)、system用户是管理操作员,权限也很大。具有sysoper角色,没有create database的权...