Debugging
Debugging
? Logging運行輸出來自一個運行應(yīng)用的消息,展示它目前的狀態(tài)。
當(dāng)錯誤發(fā)生時,來自代碼關(guān)系的部分的日志消息的(granularity)
可能不是足夠的。新的日志消息能夠插入到代碼來展示更多關(guān)于目前
狀態(tài)的消息但是它會降低這錯誤定位進程。使用一個debugger來觀察
這應(yīng)用程序的狀態(tài)時錯誤定位的最有效的方式。通過GDB,Android NDk
支持本地的代碼的調(diào)試。
? ? ? ? 本地代碼應(yīng)該本編譯通過ndk-build命令,或者通過Eclipse?
? ? ? ? ?IDE使用使用安卓開發(fā)工具。在遠程調(diào)試的建立進程期間,這
? ? ? ? ?NDK建立系統(tǒng)將產(chǎn)生一系列的文件。
? ? ? ? ?在AndroidManifest.xml文件中設(shè)置可以調(diào)試的通過android
? ? ? ? ?:debuggeble屬性。
? 這ndk-gdb腳本處理很多錯誤條件和輸出錯誤信息來讓你知道是否任何
這些條件還沒有被滿足。
? ?調(diào)試Session建立
? 這ndk-gdb腳本在開發(fā)者的利益上啟動調(diào)試會話,在調(diào)試會話建立期間
知道一系列事件發(fā)生,它對于理解在Android上的調(diào)試本地代碼的片元
是非常有用的。這個完整的調(diào)試會話建立如下:
? 這ndk-gdb腳本通過使用應(yīng)用程序管理器來啟動目標(biāo)應(yīng)用程序。這個
應(yīng)用程序管理器依賴對Zygote進程的請求。
? Zygote也知道這“app process”,是當(dāng)安卓系統(tǒng)boot的核心進程。
它在Android平臺上的核心角色是啟動Dalvik虛擬機和初始化所有的
核心安卓服務(wù)。作為一個手機操作系統(tǒng),Android需要保持應(yīng)用程序
的啟動時間盡可能的小為了提供一個高質(zhì)量的用戶體驗。為了達到這,
代替開啟一個新的進程來自應(yīng)用程序,Zygote僅僅依賴forking。在
計算中,forking克隆存在的進程。這新的進程也有與父進程相同的
內(nèi)存端,通過所有的進程獨立的執(zhí)行。
? ?在這是,應(yīng)用程序被啟動和執(zhí)行代碼。正如你所提到,這debug會話
并沒有建立。
? ?基于獲得應(yīng)用程序的進程ID,這ndk-gdb腳本在Andorid平臺上開啟
GDB和讓它附加到這運行的應(yīng)用程序。這ndk-gdb腳本配置端口使用ADB
來讓GDB Server對于宿主機可以使用的。之后,拷貝Zygote的二進制文件
和共享的類庫開始著GDB的客戶端。在這二進制被拷貝,這ndk-gdb腳本
開啟GDB客戶和調(diào)試會話變得活動。在這之后,可以開啟調(diào)試應(yīng)用程序。
? 建立調(diào)試的例子:
? 為了看到本地調(diào)試的代碼,你將使用hello-jni的實例項目。為了簡化
調(diào)試進程,修改oncreate方法。
? {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Call Native");
button.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
((Button) button).setText(stringFromJNI());
}
});
setContentView(button);
}
? 開啟調(diào)試
?調(diào)試本地代碼通過命令行和Eclipse。這一部分將會展示兩種方法。
? 對于Windows用戶的修訂
? 在window平臺上,在Andorid NDK有一個bug,阻止這GDB定位二進制。
這ndk-gdb腳本配置GDB可以使用一個GDB腳本文件。在Window平臺上,
這個腳本文件通過額外的返回來產(chǎn)生,引發(fā)了這個問題。
? ?為了修訂它,使用Eclipse,打開著<ANDROID_NDK_HOME>/ndk-gdb腳本
在編輯視圖中。到文件的結(jié)束,和增加修改如下:
? ?#Fix the line endings.
? ?sed -i 's/\r\r//' 'native_path $GDBSETUP'
? ?$GDBCLIENT -x 'native_path $GDBSETUP'
使用Eclipse
? 像運行應(yīng)用程序,Eclipse需要有一個debug配置被定義為了建立一個
debug會話。
? ? 1.run-》debug configuration
? ? 2.選擇,Android Native Application
? ? 3.在對話工具bar上旋轉(zhuǎn)著新配置。
? ? 4.瀏覽按鈕旋轉(zhuǎn)目前項目。
? ? 5.單擊應(yīng)用按鈕來存儲debug配置。
? ? 6.選擇debug配置對話框和返回到Eclipse 工作空間。
? ??
? ? 1.打開hllo-jni.c源文件在編輯視圖
? ? 2.定位本地方法,和右鍵在標(biāo)記區(qū)域,編輯視圖的左邊框。
? ? 3.正如,選擇從上下文菜單來放在一個斷點。一個藍色的點
? ? 被放到了標(biāo)記bar行來指示斷點。
? ? 4.現(xiàn)在斷點被放在了,使用top的菜單欄,選擇run-》debug?
? ? Configuration 來啟動Debug配置對話。
? ? 5.選擇debug配置
? ? 6.點擊debug按鈕
? ? 7.Eclipse支持不同的視圖,workbench布局,對于不同的任務(wù)。
? ? 基于點擊調(diào)試按鈕,Eclipse將會問你是否將轉(zhuǎn)到調(diào)試視圖,點擊
? ? Yes進行。
當(dāng)本地代碼觸發(fā)斷點,這應(yīng)用程序停止和對調(diào)試器一下控制,如下:
這個debug視圖給了本地代碼的目前狀態(tài)的簡圖。在上面的左面,這
Debug視圖展示了運行的線程的列表和他們正在運行的功能。在右上角,
這個變量視圖給可以獲得本地變量的視圖和讓你監(jiān)視目前的值。在中
間空間,這本地源代碼本展示在Editor視圖,和一個箭頭展示在marker
條靠近被執(zhí)行的行。如下:
? ?通過debug工具條下面的動作被提供:
? ? ? ? Skip All Breakpoints:使所有的斷點失效
? ? ? ? Resum:繼續(xù)執(zhí)行本地代碼知道下一個斷點。
? ? ? ? Suspend:通過發(fā)送SIGINT阻止信號到進程阻止本地代碼的執(zhí)行,
? ? ? ? 允許你查看著本地代碼的目前狀態(tài)。
? ? ? ? Step Into:接下來的本地調(diào)用,進入執(zhí)行
? ? ? ? Step Over:執(zhí)行下一個native函數(shù)和然后停止。
? ? ? ? Step Return:執(zhí)行知道本地函數(shù)的返回。
? ? ? ? Terminate:終止debug會話。
命令行
使用ndk-gdb腳本本地代碼被調(diào)試。目前這ndk-gdb腳本需要一個UNIX
shell來運行。在windows平臺,你將使用Cygwin代替debugging的命令。
首先,打開Cygwin或者widow終端,基于你的平臺。將使用hello-jni
例子項目。
? ? ? ? ?1.確保這Eclipse不在執(zhí)行為了阻止任何沖突
? ? ? ? ?2.改變目前目錄到這hello-jni項目目錄。
? ? ? ? ?3.從Eclipse刪除左面任何文件通過 rm -rf bin obj libs;
? ? ? ? ?4.編譯本地模塊通過使用ndk-build在命令行。
? ? ? ? ?5.為了編譯和打包應(yīng)用程序,確保這ANT建立腳本build.xml
? ? ? ? ?文件。如果這是第一次你正在獎勵這個項目從命令行,
? ? ? ? ?update project -p 來產(chǎn)生必要的建立文件。如果用Cygwin,
? ? ? ? ?使用android.bat代替android。
? ? ? ? ?6.編譯和打包項目在debug模式通過詢問ant debug在命令行。
? ? ? ? ?7.發(fā)布應(yīng)用程序到設(shè)備或者通過詢問ant installd命令到模擬器。
? ? ? ? ?8.默認,這ndk-gdb腳本詢問一個已經(jīng)存在的運行應(yīng)用程序;然而,
? ? ? ? ?你能夠是一個這--start或者--launch=<activity>參數(shù)來自動
? ? ? ? ?開啟應(yīng)用程序在debugging會話前。開啟debugging會話通過
? ? ? ? ?ndk -gdb --start來自命令行。當(dāng)GDB成功的附加到這hello-
? ? ? ? ?jni應(yīng)用程序,它將gdb優(yōu)先。
? ? ? ?9.增加一個斷點到hello-jni.c源文件在30行通過使用 b hello
? ? ? ?-jni.c在GDB。
? ? ? ?10.現(xiàn)在定義了斷點,在GDB詢問c來繼續(xù)著本地應(yīng)用程序的執(zhí)行
? ? ? ?11.使用Android設(shè)備或者模擬器,點擊本地調(diào)用來觸發(fā)本地函數(shù)。
使用GDB命令:
? ?有一個有用的GDB命令列表,能夠通過GDB來調(diào)試這本地代碼:
? ?break:放置一個斷點到指定位置。這個位置可能是一個函數(shù)名,或者
? ?一個文件名和一個文件的行號。
? ?enable/disable/delete <#>:Enable ,disables,或者刪除斷點。
? ?clear:清除所有的斷點。
? ?next:跳轉(zhuǎn)到下一條命令
? ?continue:繼續(xù)執(zhí)行本地代碼
? ?backtrace:表明這調(diào)用的棧。
? ?backtrace all:表明所有調(diào)用的棧包括在每個幀的局部變量。
? ?等詳細命令www.gnu.org/software/gdb/documentation/ 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
? Logging運行輸出來自一個運行應(yīng)用的消息,展示它目前的狀態(tài)。
當(dāng)錯誤發(fā)生時,來自代碼關(guān)系的部分的日志消息的(granularity)
可能不是足夠的。新的日志消息能夠插入到代碼來展示更多關(guān)于目前
狀態(tài)的消息但是它會降低這錯誤定位進程。使用一個debugger來觀察
這應(yīng)用程序的狀態(tài)時錯誤定位的最有效的方式。通過GDB,Android NDk
支持本地的代碼的調(diào)試。
? ? ? ? 本地代碼應(yīng)該本編譯通過ndk-build命令,或者通過Eclipse?
? ? ? ? ?IDE使用使用安卓開發(fā)工具。在遠程調(diào)試的建立進程期間,這
? ? ? ? ?NDK建立系統(tǒng)將產(chǎn)生一系列的文件。
? ? ? ? ?在AndroidManifest.xml文件中設(shè)置可以調(diào)試的通過android
? ? ? ? ?:debuggeble屬性。
? 這ndk-gdb腳本處理很多錯誤條件和輸出錯誤信息來讓你知道是否任何
這些條件還沒有被滿足。
? ?調(diào)試Session建立
? 這ndk-gdb腳本在開發(fā)者的利益上啟動調(diào)試會話,在調(diào)試會話建立期間
知道一系列事件發(fā)生,它對于理解在Android上的調(diào)試本地代碼的片元
是非常有用的。這個完整的調(diào)試會話建立如下:
? 這ndk-gdb腳本通過使用應(yīng)用程序管理器來啟動目標(biāo)應(yīng)用程序。這個
應(yīng)用程序管理器依賴對Zygote進程的請求。
? Zygote也知道這“app process”,是當(dāng)安卓系統(tǒng)boot的核心進程。
它在Android平臺上的核心角色是啟動Dalvik虛擬機和初始化所有的
核心安卓服務(wù)。作為一個手機操作系統(tǒng),Android需要保持應(yīng)用程序
的啟動時間盡可能的小為了提供一個高質(zhì)量的用戶體驗。為了達到這,
代替開啟一個新的進程來自應(yīng)用程序,Zygote僅僅依賴forking。在
計算中,forking克隆存在的進程。這新的進程也有與父進程相同的
內(nèi)存端,通過所有的進程獨立的執(zhí)行。
? ?在這是,應(yīng)用程序被啟動和執(zhí)行代碼。正如你所提到,這debug會話
并沒有建立。
? ?基于獲得應(yīng)用程序的進程ID,這ndk-gdb腳本在Andorid平臺上開啟
GDB和讓它附加到這運行的應(yīng)用程序。這ndk-gdb腳本配置端口使用ADB
來讓GDB Server對于宿主機可以使用的。之后,拷貝Zygote的二進制文件
和共享的類庫開始著GDB的客戶端。在這二進制被拷貝,這ndk-gdb腳本
開啟GDB客戶和調(diào)試會話變得活動。在這之后,可以開啟調(diào)試應(yīng)用程序。
? 建立調(diào)試的例子:
? 為了看到本地調(diào)試的代碼,你將使用hello-jni的實例項目。為了簡化
調(diào)試進程,修改oncreate方法。
? {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Call Native");
button.setOnClickListener(new OnClickListener() {
public void onClick(View button) {
((Button) button).setText(stringFromJNI());
}
});
setContentView(button);
}
? 開啟調(diào)試
?調(diào)試本地代碼通過命令行和Eclipse。這一部分將會展示兩種方法。
? 對于Windows用戶的修訂
? 在window平臺上,在Andorid NDK有一個bug,阻止這GDB定位二進制。
這ndk-gdb腳本配置GDB可以使用一個GDB腳本文件。在Window平臺上,
這個腳本文件通過額外的返回來產(chǎn)生,引發(fā)了這個問題。
? ?為了修訂它,使用Eclipse,打開著<ANDROID_NDK_HOME>/ndk-gdb腳本
在編輯視圖中。到文件的結(jié)束,和增加修改如下:
? ?#Fix the line endings.
? ?sed -i 's/\r\r//' 'native_path $GDBSETUP'
? ?$GDBCLIENT -x 'native_path $GDBSETUP'
使用Eclipse
? 像運行應(yīng)用程序,Eclipse需要有一個debug配置被定義為了建立一個
debug會話。
? ? 1.run-》debug configuration
? ? 2.選擇,Android Native Application
? ? 3.在對話工具bar上旋轉(zhuǎn)著新配置。
? ? 4.瀏覽按鈕旋轉(zhuǎn)目前項目。
? ? 5.單擊應(yīng)用按鈕來存儲debug配置。
? ? 6.選擇debug配置對話框和返回到Eclipse 工作空間。
? ??
? ? 1.打開hllo-jni.c源文件在編輯視圖
? ? 2.定位本地方法,和右鍵在標(biāo)記區(qū)域,編輯視圖的左邊框。
? ? 3.正如,選擇從上下文菜單來放在一個斷點。一個藍色的點
? ? 被放到了標(biāo)記bar行來指示斷點。
? ? 4.現(xiàn)在斷點被放在了,使用top的菜單欄,選擇run-》debug?
? ? Configuration 來啟動Debug配置對話。
? ? 5.選擇debug配置
? ? 6.點擊debug按鈕
? ? 7.Eclipse支持不同的視圖,workbench布局,對于不同的任務(wù)。
? ? 基于點擊調(diào)試按鈕,Eclipse將會問你是否將轉(zhuǎn)到調(diào)試視圖,點擊
? ? Yes進行。
當(dāng)本地代碼觸發(fā)斷點,這應(yīng)用程序停止和對調(diào)試器一下控制,如下:
這個debug視圖給了本地代碼的目前狀態(tài)的簡圖。在上面的左面,這
Debug視圖展示了運行的線程的列表和他們正在運行的功能。在右上角,
這個變量視圖給可以獲得本地變量的視圖和讓你監(jiān)視目前的值。在中
間空間,這本地源代碼本展示在Editor視圖,和一個箭頭展示在marker
條靠近被執(zhí)行的行。如下:
? ?通過debug工具條下面的動作被提供:
? ? ? ? Skip All Breakpoints:使所有的斷點失效
? ? ? ? Resum:繼續(xù)執(zhí)行本地代碼知道下一個斷點。
? ? ? ? Suspend:通過發(fā)送SIGINT阻止信號到進程阻止本地代碼的執(zhí)行,
? ? ? ? 允許你查看著本地代碼的目前狀態(tài)。
? ? ? ? Step Into:接下來的本地調(diào)用,進入執(zhí)行
? ? ? ? Step Over:執(zhí)行下一個native函數(shù)和然后停止。
? ? ? ? Step Return:執(zhí)行知道本地函數(shù)的返回。
? ? ? ? Terminate:終止debug會話。
命令行
使用ndk-gdb腳本本地代碼被調(diào)試。目前這ndk-gdb腳本需要一個UNIX
shell來運行。在windows平臺,你將使用Cygwin代替debugging的命令。
首先,打開Cygwin或者widow終端,基于你的平臺。將使用hello-jni
例子項目。
? ? ? ? ?1.確保這Eclipse不在執(zhí)行為了阻止任何沖突
? ? ? ? ?2.改變目前目錄到這hello-jni項目目錄。
? ? ? ? ?3.從Eclipse刪除左面任何文件通過 rm -rf bin obj libs;
? ? ? ? ?4.編譯本地模塊通過使用ndk-build在命令行。
? ? ? ? ?5.為了編譯和打包應(yīng)用程序,確保這ANT建立腳本build.xml
? ? ? ? ?文件。如果這是第一次你正在獎勵這個項目從命令行,
? ? ? ? ?update project -p 來產(chǎn)生必要的建立文件。如果用Cygwin,
? ? ? ? ?使用android.bat代替android。
? ? ? ? ?6.編譯和打包項目在debug模式通過詢問ant debug在命令行。
? ? ? ? ?7.發(fā)布應(yīng)用程序到設(shè)備或者通過詢問ant installd命令到模擬器。
? ? ? ? ?8.默認,這ndk-gdb腳本詢問一個已經(jīng)存在的運行應(yīng)用程序;然而,
? ? ? ? ?你能夠是一個這--start或者--launch=<activity>參數(shù)來自動
? ? ? ? ?開啟應(yīng)用程序在debugging會話前。開啟debugging會話通過
? ? ? ? ?ndk -gdb --start來自命令行。當(dāng)GDB成功的附加到這hello-
? ? ? ? ?jni應(yīng)用程序,它將gdb優(yōu)先。
? ? ? ?9.增加一個斷點到hello-jni.c源文件在30行通過使用 b hello
? ? ? ?-jni.c在GDB。
? ? ? ?10.現(xiàn)在定義了斷點,在GDB詢問c來繼續(xù)著本地應(yīng)用程序的執(zhí)行
? ? ? ?11.使用Android設(shè)備或者模擬器,點擊本地調(diào)用來觸發(fā)本地函數(shù)。
使用GDB命令:
? ?有一個有用的GDB命令列表,能夠通過GDB來調(diào)試這本地代碼:
? ?break:放置一個斷點到指定位置。這個位置可能是一個函數(shù)名,或者
? ?一個文件名和一個文件的行號。
? ?enable/disable/delete <#>:Enable ,disables,或者刪除斷點。
? ?clear:清除所有的斷點。
? ?next:跳轉(zhuǎn)到下一條命令
? ?continue:繼續(xù)執(zhí)行本地代碼
? ?backtrace:表明這調(diào)用的棧。
? ?backtrace all:表明所有調(diào)用的棧包括在每個幀的局部變量。
? ?等詳細命令www.gnu.org/software/gdb/documentation/ 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖
總結(jié)
- 上一篇: 控制Log
- 下一篇: TroubleShoot