日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

TroubleShoot

發布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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和終止執行。
? ?

總結

以上是生活随笔為你收集整理的TroubleShoot的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。