除錯器

JavaScript 除錯器 (Debugger) 可分為 2 種。其一是直接於 Firefox 中執行,針對內容除錯。另一種則是於 Firefox OS 裝置上執行,或在 Android 裝置中的 Firefox 執行,讓使用者針對程式碼除錯。此 2 種除錯器的主要差異在於:遠端除錯器 (Remote debugger) 是於本身視窗中執行;而針對使用者正在除錯的網頁內容,網頁內容除錯器 (Web content debugger) 則將位於相同分頁中。

啟動除錯器

網頁內容除錯

針對 Firefox 中直接執行的網頁內容,不論是儲存在本端電腦或伺服器上,若要進行除錯,請點選「網頁開發者 (Web Developer)」功能表中的「除錯器 (Debugger)」選項。

Requires Firefox 19.0

遠端除錯

一旦使用者已設定了 Firefox 與 Firefox OS 的除錯支援功能,即可在 Firefox OS 裝置或 Firefox OS Simulator 上執行程式碼,透過遠端除錯器進行除錯。

若要針對 Firefox OS 或 Android 裝置所執行的 JavaScript 進行除錯,則應先確認該裝置已連至 USB 埠,且 lsusb 與 adb 均可辨認此裝置。接著應開啟終端視窗,將合適的 TCP 埠指派至裝置,再鍵入以下指令:

adb forward tcp:6000 tcp:6000

小提示:只要重新啟動裝置,均必須再次指派通訊埠。

只要點選「網頁開發者」中的「遠端除錯器」選項,即可開啟遠端除錯器。系統將要求使用者指定所要連接的 IP 位址與通訊埠,以利除錯作業。除非使用者更改了裝置上的設定,否則僅需保留原始的 localhost:6000 設定即可。點選「OK」再稍等數分鐘之後,隨即將啟動並執行除錯器。

A quick look at what the remote debugger looks like

此時,由於使用者尚未設定任何中斷點 (Breakpoint) 或其他選項,因此除錯器不會進行作業。裝置將持續自行運作。接著將說明除錯器的實際使用情形。

除錯器工具列

工具列具備數個控制元:

PNG of the labeled toolbar diagram

暫停/繼續 (Pause/Resume) (F6)
可暫停或繼續目前除錯中的指令碼。
Step Over (F7)
從目前 JavaScript 程式碼的行數跳往下一行。
Step Into (F8)
進入 JavaScript 程式碼目前行數的函式呼叫。
Step Out (Shift-F8)
執行指令碼,直到退出目前的函式。
Script Chooser (Ctrl-P 或 Cmd-P)
此功能表可讓使用者選擇目前正在執行中的 scripts,以讀取其程式碼、設定中斷點等等。
指令碼篩選器 (Script Filter)
指令碼篩選器 (如同搜尋對話框) 可鍵入字串,以篩選出所需的指令碼。請參閱下方的 Using the script filter
展開窗格 (Expand Panes)
展開或收縮視窗,可顯示/隱藏左右兩邊的窗格。
除錯器選項 (Debugger Options)
將會顯示一個可以讓使用者設定除錯器的功能表。請參閱下方的 Debugger options

注意:網頁內容除錯器的最右方亦提供「關閉」按鈕,按下即可關閉除錯器。

使用指令碼篩選器 (Script filter)

若點選工具列中的指令碼篩選器,即可鍵入字串,讓指令碼選擇功能表顯示吻合的指令碼。此外,只要點選此對話框,亦可看見特殊運算子,讓此對話框提供搜尋對話框與更多功能。這些特殊運算子亦具備鍵盤快捷鍵,將自動帶領使用者進入篩選對話框,並同時將運算子插入對話框中。使用者只要開始鍵入內容即可。

Screenshot of the search box operator popup panel.

在所有檔案中搜尋 (Search in all files) - ! (Cmd-Opt-F)
針對使用者鍵入的文字,搜尋所有執行中的指令碼。此功能將於工具列下方再新增 1 個窗格,顯示所有吻合的檔案。各個檔案另有註記對話框,讓使用者可看到其內的吻合項目。
在此檔案中搜尋 (Find in this file) - # (Cmd-F)
針對目前觀看中的檔案,搜尋使用者鍵入的文字。
跳到某行 (Jump to line) - : (Cmd-J)
跳到使用者於對話框中所鍵入的行數。
過濾變數 (Filter variables) - * (Cmd-Opt-V)
篩選器將僅顯示吻合特定字串的變數。

除錯器選項

若按下除錯器選項圖示,將蹦現選項功能表,讓使用者可調整除錯器的動作。

發生例外時暫停 (Pause on exceptions)
若啟用此選項,則不論何時丟出 JavaScript 例外,隨即自動暫停執行指令碼。
啟動時顯示窗格 (Show panes on startup)
若啟用此選項,隨即顯示除錯器兩側的窗格。首次啟動除錯器時,依預設值將不會顯示此兩側的窗格。
顯示隱藏屬性 (Show hidden properties)
若啟用此選項,則將不會顯示隱藏的 JavaScript 屬性;亦即這些屬性本為顯示隱藏 (Non-enumerable)。
顯示變數搜尋框 (Show variables searchbox)
若啟用此選項,將為變數窗格新增「過濾變數 (Filter variables)」的搜尋對話框,讓使用者可篩選已顯示的變數清單。

使用除錯器

Javascript 除錯器有其他大多數除錯器中也有的標準功能。

中斷點 (Breakpoints)

透過指令碼選擇器的下拉式功能表,即可為所需的檔案設定中斷點 (假設使用者尚未看到中斷點)。接著針對行編號欄左側的行編號本身,點選所要設定中斷點的程式碼行。另亦可針對想要設定中斷點的該程式碼行,按下滑鼠右鍵,透過顯示的文字功能表建立中斷點 (Ctrl+B 或Cmd-B) 或條件式中斷點 (Ctrl+Shift+B or Cmd-Shift-B)。

舉例來說,我們先用遠端除錯器設定中斷點,且只要使用者下拉通知列 (Notification bar) 隨即啟動中斷點。請先點選「app://system.gaiamobile.org/js/quick_settings.js」(只要下拉通知列就會顯示此快速設定應用程式)。找到 handleEvent()方式並點選程式碼第一行的左側。接著就會在該行旁邊新增 1 個藍色的中斷點指示元,即如同:

Image showing what a set breakpoint looks like

只要再次點選中斷點指示元,即可將此中斷點關閉。而在堆疊面板底部,亦將顯示目前已設定的所有中斷點。可參閱 Managing breakpoints 進一步了解此清單。

現在,於自己的裝置中拉下通知列。下拉通知列之後,只要應用程式接收到第一個事件,隨即就會啟動中斷點。若尚未顯示這些窗格,則此時將開啟相關窗格,以顯示變數與堆疊架構等。此時除錯器看起來如下:

An image showing what it looks like when a breakpoint has been reached.

而裝置看起來如下:

Image showing what the device looks like when the sample breakpoint fires.

現在可來回點選整個堆疊架構,以觀看呼叫歷史紀錄。舉例來說,只要點選堆疊架構面板中的「ut_onTouchEnd」,將隨即於「app://system.gaiamobile.org/js/utility_tray.js」中顯示程式碼。在下拉通知列之後,針對使用者將手指自螢幕上移開之後所發生的事件,均將由此程式碼進行處理。

接著可使用工具列中的繼續、跳過、進入、跳出等按鈕,逐步執行程式碼完畢。後續要執行的下一行程式碼,其左側將顯示綠色箭頭。當然,使用者同時亦可進行檢查變數、設定/移除中斷點等作業。

在設定中斷點之後,源碼的右側框內亦將顯示藍色指示元。依需要點選該指示元,即可快速捲動至對應的中斷點。

條件式中斷點 (Conditional breakpoint)

條件式中斷點屬於特殊中斷點,僅於既有的 JavaScript 表示式為 True 時,才會觸發條件式中斷點。若要設定條件式中斷點,可對程式碼行按下滑鼠右鍵,點選「新增條件式中斷點 (Add conditional breakpoint)」,或按下 Ctrl+Shift+B/Cmd-Shift-B。亦可先建立一般中斷點,再對除錯器視窗左下角的中斷點清單按下滑鼠右鍵,即可為中斷點新增條件。


接著可輸入條件。當條件為 True 才會觸發中斷點:

The box for configuring a conditional breakpoint

如此一來,當到達對應的程式碼行,只有「evt.type == 'click'」表示式為 True 才或暫停執行。

管理中斷點

透過除錯器視窗左下角的中斷點清單,即可管理自己設定的中斷點。只要勾選/取消勾選斷點的方塊,即可開啟/關閉該中斷點。若點選任何條件式中斷點,均將蹦現條件式中斷點的編輯面板,如同 Conditional breakpoints 中所示。.

若對中斷點按下滑鼠右鍵,均可開啟額外選項:

移除所有中斷點 (Remove all breakpoints)
移除目前的所有中斷點。
啟用所有中斷點 (Enable all breakpoints)
啟用目前的所有中斷點。此即勾選所有中斷點方塊的快捷功能。
停用所有中斷點 (Disable all breakpoints)
停用 (而不是移除) 所有中斷點。此即取消勾選所有中斷點方塊的快捷功能。
啟用其他 (Enable others)
除了目前按下滑鼠右鍵的中斷點之外,啟用所有中斷點。
停用其他 (Disable others)
除了目前按下滑鼠右鍵的中斷點之外,停用所有中斷點。
移除其他 (Remove others)
除了目前按下滑鼠右鍵的中斷點之外,移除所有中斷點。
設定條件式中斷點 (Configure conditional breakpoint)
設定目前按下滑鼠右鍵的條件式中斷點。若該中斷點並非條件式中斷點,則可新增條件以將之轉為條件式中斷點。
停用中斷點 (Disable breakpoint)
停用目前按下滑鼠右鍵的中斷點。
啟用中斷點 (Enable breakpoint)
啟用目前按下滑鼠右鍵的中斷點。

變數面板 (Variable panel)

First shot of the variable panel除錯器的右側窗格,大部分都顯示了使用者目前區域可視範圍中的可用變數。如圖所示,內有目前執行中函式 (此為 qs_handleEvent())、呼叫函式 (此為 ut_show())、全域範圍 (此為 Window 物件)。

只要按下提示三角形,即可展開各個物件,顯示其成員與其內容。若點選變數目前的數值再輸入新數值,即可更改變數數值。舉例來說,若點選 geolocationEnabled 旁邊的「true」,即可鍵入「false」而將該值設定為 false。而編輯過的變數數值,均將以黃色呈現,如:
 

Example of how a changed variable looks.

若將滑鼠游標移至變數,即會出現提示訊息,內含變數的相關資訊。舉例來說,若將滑鼠游標移至 evt 物件,就會顯示「configurable enumerable writable」;亦即此 evt 物件不可設定,但為可顯示並可撰寫。請參閱 Object.defineProperty() 以進一步了解這些屬性指示元的意義。

若啟用如截圖所示的變數篩選對話框,則可減少此清單中的叢集,讓清單僅顯示使用者想看的物件。此為循環式的搜尋功能,並將搜尋子物件。舉例來說,若鍵入「blue」,則可限制列出 qs_handleEvent()函式可視範圍中的「this.bluetooth」物件;另將限制列出全域可視範圍中的「Bluetooth」與「BluetoothTransfer」物件。

 

Watch expressions

Watch Expression,可估算暫停執行的表示式,讓使用者檢查這些表示式的結果。使用者可檢視程式碼中的不變數 (Invariant),讓使用者找出程式碼中「存在但不必要」的部份,以利相關檢驗。若要新增 Watch Expression,可點選對話框中的「Add watch expression」,再輸入 JavaScript 表示式,即可在逐步執行程式碼期間,監控該 JavaScript 表示式的輸出。

接著可開始執行程式碼。在開始逐步執行程式碼之前,Watch Expression 將不會有任何動作。所以直到中斷點之前,均不會發生任何情況。一旦抵達中斷點,將有對話框顯示  Active watch expressions 及其目前的數值。

舉例來說,我們假設現在正逐句通過某個程式碼,而想要快點知道某個變數「a」乘以 2 的數值,但不想再花腦筋受到任何「思考」的干擾。此時可將「a*2」表示式鍵入至「Add a watch expression box」再輸按下 Enter、設定合適的中斷點,最後執行程式碼。

若剛剛的「a」值為 1,則一旦抵達中斷點就會顯示結果如下:

What a fired watch expression looks like

接著可逐步執行程式碼,同時觀看表示式變化時的數值。只要數值產生變化,則對話框均將快速閃動黃色 1 次。使用者只要點選 Watch expression 旁邊的「x」圖示,即可移除該表示式。當然,不限制每次僅能移除 1 組 Watch expression。

停止除錯器

完成除錯之後,可開啟 Settings app 再點選 Device Information,即可關閉裝置上的遠端除錯功能。在此頁面上可看到「More Information」按鈕。點選按鈕的後續頁面可向下捲動至「Developer」,再點選此按鈕。如此即可顯示開發者選項清單,再找到 Turn off Remote Debugging。

注意:若只是要啟用/停用裝置上的遠端除錯功能,均不需重新開機啟動。自 2012 年 11 月 29 日的 Nightly build 之後的版本皆然。

另請參閱

Document Tags and Contributors

Contributors to this page: stephaniehobson, yurenju, MashKao
最近更新: stephaniehobson,