TroubleShoot
生活随笔
收集整理的這篇文章主要介紹了
TroubleShoot
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Troubleshooting
? ?在開發階段,logging讓你決定和展示有利于解決問題關于應用程序的狀態的信息。
通過logging的展示的信息對于Debugging很重要但是這是不夠的,但是
應該知道錯誤發生在哪里。當面對這無法預期的錯誤時,錯誤
定位成為了一個拯救者。知道了正確的工具和技術使你能迅速的解決問題。
? ?棧追蹤分析:
為了觀察棧,你將安裝一個bug在hello-jni實例應用程序中將引發程序
崩潰。使用Eclipse,打開著hello-jni.c的源文件。修改本地函數的
內容如下:
? ?static jstring func1( JNIEnv* env )
{
/* BUG BEGIN */
env = 0;
/* BUG END */
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return func1(env);
}
通過設置JNIEnv的接口指針的值為0,你將觸發這個崩潰?,F在建立
和運行這個應用程序。當應用程序開始,點擊Call本地方法來觸發這
本地的功能。這應用程序崩潰,和一個棧的幾率被展示在logcat中
如下:
? ?帶有崩潰信號的開始行指示這棧的調用。#00的開始行是崩潰發生的
。接下的一行,#01,是上一個函數的調用,等等。在這PC的后面這
數子是代碼的地址。正如在棧記錄所看到的,這本地代碼的崩潰在地址
000003c處,和上一個函數調用時stringFromJNI本地函數。這個000003c
地址本身可能不會告訴你太多,但是使用正確的工具這個地址能夠
被用來發現真正的文件盒crash發生的行。Android NDK帶有ndk-stack
工具能夠把棧記錄到真正文件的名字和行號。在命令行,進入項目根目錄
,使用
? ?adb locat|ndk-stack -sym 0bj/local/armabi
這ndk-stack工具將翻譯棧,如下。地址得到翻譯到jni/hello-jni.c在
源文件33行。這些信息使錯誤定位更加容易。通過簡單放置一個斷點在
地址上你能夠阻止應用程序和監聽應用程序的狀態。
? ?JNI的擴展檢測:
默認情況下,JNI函數做非常少的錯誤檢測。錯誤經常導致程序崩潰。Andoid
提供一個擴展的檢測模式對于JNI調用,如CheckJNI。當開啟下,JavaVM
和JNIENV接口指針轉到了函數表來執行一個擴展水平的錯誤檢測在調用
真正的實現前。CheckJNI能夠偵測接下的問題:
? ?設法分配一個負數長度的數組
? ?Bad或NULL指針被傳遞給JNI函數
? ?當傳遞給類名時,語法錯誤
? ?當在critical部分是,JNI調用
? ?錯誤的參數當傳遞到NEWDirectByeBuffer
? ?當一個異常發生時JNI調用
? ?JNIEnv接口指針被用作錯誤線程
? ?Field類型和set<Type>Fiel函數不搭配
? ?函數類型和Call<Type>Method函數不搭配
? ?DeleteGlobalRef/DeleteLocalRef調用有錯誤引用類型
? ?錯誤的釋放模式被傳遞到Release<Type>ArrayElement函數
? ?不兼容的錯誤類型返回從本地方法
? ?傳遞到一個JNI調用無效的UTF-8序列。
默認情況下,在模擬器上CheckJNI模式開啟的,但是并不在常用的
Andoid設備上,由于它在系統性能的影響。
? ?開啟ChckJNI:
? ?在一個regular設備上,使用命令行,你能夠開啟CheckJNI模式通過
使用:adb shell setprop debug.checkjni 1
? ?這并不影響著運行的應用程序但是任何應用程序開啟向導使
CheckJni開啟。CheckJNI狀態被展示在logcat中,如下:
? ?jstring
? ?Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
? ?jobject thiz )
? ?{
? ? ? ?jintArray javaArray = (*env)->NewIntArray(env, -1);
? ? ? ?return (*env)->NewStringUTF(env, "Hello from JNI !");
? ?}
創建了一個負長度的整形數組。建立和運行應用程序在模擬器上。當
應用程序開啟,點擊Call本地按鈕來觸發本地方法。如下,CheckJNI將
展示一個警告信息在logcat和終止執行。
? ?
? ?在開發階段,logging讓你決定和展示有利于解決問題關于應用程序的狀態的信息。
通過logging的展示的信息對于Debugging很重要但是這是不夠的,但是
應該知道錯誤發生在哪里。當面對這無法預期的錯誤時,錯誤
定位成為了一個拯救者。知道了正確的工具和技術使你能迅速的解決問題。
? ?棧追蹤分析:
為了觀察棧,你將安裝一個bug在hello-jni實例應用程序中將引發程序
崩潰。使用Eclipse,打開著hello-jni.c的源文件。修改本地函數的
內容如下:
? ?static jstring func1( JNIEnv* env )
{
/* BUG BEGIN */
env = 0;
/* BUG END */
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return func1(env);
}
通過設置JNIEnv的接口指針的值為0,你將觸發這個崩潰?,F在建立
和運行這個應用程序。當應用程序開始,點擊Call本地方法來觸發這
本地的功能。這應用程序崩潰,和一個棧的幾率被展示在logcat中
如下:
? ?帶有崩潰信號的開始行指示這棧的調用。#00的開始行是崩潰發生的
。接下的一行,#01,是上一個函數的調用,等等。在這PC的后面這
數子是代碼的地址。正如在棧記錄所看到的,這本地代碼的崩潰在地址
000003c處,和上一個函數調用時stringFromJNI本地函數。這個000003c
地址本身可能不會告訴你太多,但是使用正確的工具這個地址能夠
被用來發現真正的文件盒crash發生的行。Android NDK帶有ndk-stack
工具能夠把棧記錄到真正文件的名字和行號。在命令行,進入項目根目錄
,使用
? ?adb locat|ndk-stack -sym 0bj/local/armabi
這ndk-stack工具將翻譯棧,如下。地址得到翻譯到jni/hello-jni.c在
源文件33行。這些信息使錯誤定位更加容易。通過簡單放置一個斷點在
地址上你能夠阻止應用程序和監聽應用程序的狀態。
? ?JNI的擴展檢測:
默認情況下,JNI函數做非常少的錯誤檢測。錯誤經常導致程序崩潰。Andoid
提供一個擴展的檢測模式對于JNI調用,如CheckJNI。當開啟下,JavaVM
和JNIENV接口指針轉到了函數表來執行一個擴展水平的錯誤檢測在調用
真正的實現前。CheckJNI能夠偵測接下的問題:
? ?設法分配一個負數長度的數組
? ?Bad或NULL指針被傳遞給JNI函數
? ?當傳遞給類名時,語法錯誤
? ?當在critical部分是,JNI調用
? ?錯誤的參數當傳遞到NEWDirectByeBuffer
? ?當一個異常發生時JNI調用
? ?JNIEnv接口指針被用作錯誤線程
? ?Field類型和set<Type>Fiel函數不搭配
? ?函數類型和Call<Type>Method函數不搭配
? ?DeleteGlobalRef/DeleteLocalRef調用有錯誤引用類型
? ?錯誤的釋放模式被傳遞到Release<Type>ArrayElement函數
? ?不兼容的錯誤類型返回從本地方法
? ?傳遞到一個JNI調用無效的UTF-8序列。
默認情況下,在模擬器上CheckJNI模式開啟的,但是并不在常用的
Andoid設備上,由于它在系統性能的影響。
? ?開啟ChckJNI:
? ?在一個regular設備上,使用命令行,你能夠開啟CheckJNI模式通過
使用:adb shell setprop debug.checkjni 1
? ?這并不影響著運行的應用程序但是任何應用程序開啟向導使
CheckJni開啟。CheckJNI狀態被展示在logcat中,如下:
? ?jstring
? ?Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
? ?jobject thiz )
? ?{
? ? ? ?jintArray javaArray = (*env)->NewIntArray(env, -1);
? ? ? ?return (*env)->NewStringUTF(env, "Hello from JNI !");
? ?}
創建了一個負長度的整形數組。建立和運行應用程序在模擬器上。當
應用程序開啟,點擊Call本地按鈕來觸發本地方法。如下,CheckJNI將
展示一個警告信息在logcat和終止執行。
? ?
總結
以上是生活随笔為你收集整理的TroubleShoot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Debugging
- 下一篇: 新的C库Bionic的介绍