JavaScript/VB Script指令碼程式一般有兩種執行方式,一種是嵌入在宿主程式裡面執行,比如在IE瀏覽器裡面執行;另外一種,在資源管理員裡面雙擊執行(雖然還是通過另外一個程式解釋執行,但是給人的感覺畢竟是直接運行)。
這兩種方式,都可以使用Visual Studio來進行調試,先看大家用得比較頻繁的網頁指令碼程式的調試:
1. 要調試網頁裡面的指令碼程式,調試器需要宿主程式—這裡也就是IE的支援,實際上所有的指令碼程式解譯器都實現了一個COM的調試介面。調試器通過查詢解譯器的這個介面,可以設定斷點,查詢變數以及捕捉異常,當然,查詢到這個介面,需要宿主程式同意……至於如何?這個介面,我們會在以後的文章裡面講到。
2. 預設情況下,IE是將指令碼調試支援功能關閉的,因此你需要顯示地開啟它。開啟IE,點擊“工具”—“Internet 選項”,在“Internet 選項”裡面選擇進階頁簽,在“設定”列表裡面,找到“禁用指令碼調試(Internet Explorer)”選項,它預設是勾選上的—將它勾掉。
3. 使用IE開啟一個新的網頁,無論是一個遠端,或者本地的(從本地硬碟開啟)網頁。例如下面一個網頁,另存新檔test.html:
1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2. <html xmlns="http://www.w3.org/1999/xhtml"> 3. <head> 4. <title>JavaScript調試</title> 5. <script language=javascript> 6. function onload() { 7. var test = unescape("http://www.google.com"); 8. alert(test); 9. } 10. </script> 11. </head> 12. <body onload="onload()"> 13. </body> 14. </html> |
4. 啟動Visual Studio,點擊VS菜單裡面的“工具”—“附加到進程”菜單,開啟“附加到進程”視窗裡面。Visual Studio其實支援很多種偵錯模式,調試C++(native)程式,調試.NET(託管)程式,調試指令碼程式,調試Silverlight程式以及調試SQL預存程序。預設情況下,Visual Studio會根據附加的進程類型來選擇最合適的偵錯模式,但是有的時候,你需要手工設定一下。例如Internet Explorer這種程式,IE可以同時運行多種子程式,IE本身和ActiveX控制項是C++/C寫成的,IE可以運行Winform/WPF程式,IE可以運行Silverlight程式,當然,IE最多的還是運行JavaScript/VB Script指令碼程式。Visual Studio在附加到Internet Explorer進程的時候,總是會被IE弄糊塗,所以我們需要手工告知Visual Studio我們希望採用什麼偵錯模式。
在“附加到進程”視窗裡面,在“附加到…”(英文是Attach To…)文字框旁邊點擊“選擇”按鈕,在彈出的“選擇代碼類型”視窗裡面,勾選“調試下列類型”,並選擇“指令碼”。如所示:
5. 接著你需要在“附加到進程”視窗裡面選擇要附加的進程,在“可用進程”(Available Processes)列表裡面,有一個“類型”(Type)列,裡面列舉了對應進程支援的偵錯模式,比如你可以看到在裡,好幾個iexplore.exe支援指令碼和C++偵錯模式(Script, x86)。因此你所需要做的就是找到執行網頁的進程,這裡我選擇了ID為3732的iexplore.exe,因為那個是運行第三步網頁的進程。最後點擊“附加”(Attach)按鈕使用指令碼偵錯模式調試指定的IE進程。
註:細心的網友可能會看到,ID為1692的iexplore.exe的標題是“JavaScript調試”—對應的就是我們執行網頁的瀏覽器進程ID。其實在IE 8以前,選擇執行網頁的瀏覽器進程一般都是根據瀏覽器的標題做的,但是IE 8裡面有一些改變,這個變化以後的文章裡會講到。
6. 附加上去以後,在網頁的第7行(網頁源碼在第三步裡面)設定一個斷點—就跟平常調試C#和C++代碼一樣,設定好了以後,返回到IE進程裡面,重新整理網頁。這個時候,Visual Studio應該會在網頁的第7行中斷IE的執行,你可以在“監視”(Watch)視窗裡面查看指令碼變數的值: