# 調試器
~~~
穩定度: 3 - 穩定
~~~
V8 提供了一個強大的調試器,可以通過 [TCP 協議](http://code.google.com/p/v8/wiki/DebuggerProtocol)從外部訪問。Node 內建了這個調試器的客戶端。要使用調試器,以 `debug` 參數啟動 Node,出現提示符:
~~~
% node debug myscript.js
< debugger listening on port 5858
connecting... ok
break in /home/indutny/Code/git/indutny/myscript.js:1
1 x = 5;
2 setTimeout(function () {
3 debugger;
debug>
~~~
Node 的調試器客戶端并未完整支持所有命令,但簡單的步進和檢查是可行的。通過腳本的源代碼中放置 `debugger;` 語句,您便可啟用一個斷點。
比如,假設有一個類似這樣的 `myscript.js`:
~~~
// myscript.js
x = 5;
setTimeout(function () {
debugger;
console.log("world");
}, 1000);
console.log("hello");
~~~
那么,當調試器運行時,它會在第 4 行中斷:
~~~
% node debug myscript.js
< debugger listening on port 5858
connecting... ok
break in /home/indutny/Code/git/indutny/myscript.js:1
1 x = 5;
2 setTimeout(function () {
3 debugger;
debug> cont
< hello
break in /home/indutny/Code/git/indutny/myscript.js:3
1 x = 5;
2 setTimeout(function () {
3 debugger;
4 console.log("world");
5 }, 1000);
debug> next
break in /home/indutny/Code/git/indutny/myscript.js:4
2 setTimeout(function () {
3 debugger;
4 console.log("world");
5 }, 1000);
6 console.log("hello");
debug> repl
Press Ctrl + C to leave debug repl
> x
5
> 2+2
4
debug> next
< world
break in /home/indutny/Code/git/indutny/myscript.js:5
3 debugger;
4 console.log("world");
5 }, 1000);
6 console.log("hello");
7
debug> quit
%
~~~
`repl` 命令允許您遠程執行代碼;`next` 命令步進到下一行。此外還有一些其它命令,輸入 `help` 查看。
### 監視器
調試代碼時您可以監視表達式或變量值。在每個斷點中監視器列表中的各個表達式會被以當前上下文執行,并在斷點的源代碼前顯示。
輸入 `watch("my_expression")` 開始監視一個表達式;`watchers` 顯示活動監視器;`unwatch("my_expression")` 移除一個監視器。
### 命令參考
### 步進
- `cont`, `c` - 繼續執行
- `next`, `n` - Step next
- `step`, `s` - Step in
- `out`, `o` - Step out
- `pause` - 暫停執行代碼(類似開發者工具中的暫停按鈕)
### 斷點
- `setBreakpoint()`, `sb()` - 在當前行設置斷點
- `setBreakpoint(line)`, `sb(line)` - 在指定行設置斷點
- `setBreakpoint('fn()')`, `sb(...)` - 在函數體的第一條語句設置斷點
- `setBreakpoint('script.js', 1)`, `sb(...)` - 在 script.js 的第一行設置斷點
- `clearBreakpoint`, `cb(...)` - 清除斷點
在一個尚未被加載的文件(模塊)中設置斷點也是可行的:
~~~
% ./node debug test/fixtures/break-in-module/main.js
< debugger listening on port 5858
connecting to port 5858... ok
break in test/fixtures/break-in-module/main.js:1
1 var mod = require('./mod.js');
2 mod.hello();
3 mod.hello();
debug> setBreakpoint('mod.js', 23)
Warning: script 'mod.js' was not loaded yet.
1 var mod = require('./mod.js');
2 mod.hello();
3 mod.hello();
debug> c
break in test/fixtures/break-in-module/mod.js:23
21
22 exports.hello = function() {
23 return 'hello from module';
24 };
25
debug>
~~~
### 信息
- `backtrace`, `bt` - 顯示當前執行框架的回溯
- `list(5)` - 顯示腳本源代碼的 5 行上下文(之前 5 行和之后 5 行)
- `watch(expr)` - 向監視列表添加表達式
- `unwatch(expr)` - 從監視列表移除表達式
- `watchers` - 列出所有監視器和它們的值(每個斷點會自動列出)
- `repl` - 在所調試的腳本的上下文中打開調試器的 repl 執行代碼
### 執行控制
- `run` - 運行腳本(調試器開始時自動運行)
- `restart` - 重新運行腳本
- `kill` - 終止腳本
### 雜項
- `scripts` - 列出所有已加載的腳本
- `version` - 顯示 V8 的版本
### 高級使用
V8 調試器可以從兩種方式啟用和訪問:以 `--debug` 命令行標志啟動 Node;或者向已存在的 Node 進程發送 `SIGUSR1` 信號。
一旦一個進程進入了調試模式,它便可被 Node 調試器連接。調試器可以通過 `pid` 或 URI 來連接,語法是:
- `node debug -p <pid>` - 通過 `pid` 連接進程
- `node debug <URI>` - 通過類似 localhost:5858 的 URI 連接進程