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