如何利用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 StringTAG= "CPPTestActivity" ;
@Override
protected void onCreate(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
public boolean onCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
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-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" );
return JNI_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)
{
return pow (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。。。
return a/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:workspaceAndroidMyOwnSamplesJNICPPTestobj local armeabi **********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查看堆栈?望高手指点!