node調(diào)試協(xié)議
引言
研究node調(diào)試協(xié)議(實際上是chrome調(diào)試協(xié)議)對設(shè)計和實現(xiàn)自己的node遠程調(diào)試工具來說至關(guān)重要,它不僅被用在chrome的開發(fā)工具中,也可以用它來實現(xiàn)自己的web ide產(chǎn)品,比如調(diào)試node中運行的javascript代碼贬堵。
協(xié)議的版本
chrome調(diào)試協(xié)議是調(diào)試客戶端和調(diào)試目標進行調(diào)試交互的規(guī)范深碱,該協(xié)議通過json格式的文檔protocol.json給出。
目前協(xié)議穩(wěn)定版本是1.2她奥,針對不同的運行環(huán)境protocol.json分為兩個不同的協(xié)議內(nèi)容瓮增,一種是提供給chrome瀏覽器的,一種是提供給基于V8 javascript引擎的運行環(huán)境哩俭,如node绷跑。
通過https://chromedevtools.github.io/debugger-protocol-viewer/ 可以了解協(xié)議的相關(guān)信息。
目前凡资,提供給瀏覽器的協(xié)議描述在:
https://chromedevtools.github.io/debugger-protocol-viewer/1-2/砸捏。
提供給基于V8運行環(huán)境的在:
https://chromedevtools.github.io/debugger-protocol-viewer/v8/。
為了調(diào)試node應(yīng)用程序隙赁,所以我們比較關(guān)注后者垦藏。
node6.3.0發(fā)布了一個v8-inspector重大變更,支持--inspect啟動標識伞访,因此從該版本開始掂骏,可以基于chrome調(diào)試協(xié)議去調(diào)試node了。
查看node所支持的協(xié)議版本
通過如下命令啟動node應(yīng)用程序咐扭,如下所示:(app.js是你要運行的應(yīng)用程序的入口程序)
node --inspect=9222 app.js
在瀏覽器中輸入url:
http://127.0.0.1:9222/json/version
將得到類似如下返回內(nèi)容:
node6.3
[ { "Browser": "node.js/v6.3.0", "Protocol-Version": "1.1", "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/45.0.2446.0 Safari/537.36", "WebKit-Version": "537.36 (@198122)"} ]
node7.0
[ {
"Browser": "node.js/v7.0.0",
"Protocol-Version": "1.1"
} ]
從返回內(nèi)容來看協(xié)議版本為1.1芭挽。
最好升級node到最新的穩(wěn)定版,因為在node6.8中發(fā)布了一個變更蝗肪,可以通過url:
http://127.0.0.1:9222/json/protocol獲取到j(luò)son格式的具體協(xié)議內(nèi)容袜爪。
類似如下內(nèi)容:
{
"version": { "major": "1", "minor": "1" },
"domains": [
......
]
}
協(xié)議內(nèi)容
調(diào)試協(xié)議分為六個domain,分別為Schema薛闪、Runtime辛馆、Debugger、Console豁延、Profiler昙篙、HeapProfiler。我們這里主要關(guān)注Debugger诱咏。
Debugger向開發(fā)者提供了調(diào)試javascript的的能力苔可,如java調(diào)試一樣,可以設(shè)置斷點袋狞、跟蹤線程棧焚辅、進行step。
Debugger域
方法
-
enable()
針對當前頁面啟動調(diào)試能力苟鸯,客戶端在調(diào)試前必須調(diào)用該方法啟動調(diào)試能力同蜻,并在得到該方法的返回后才能正式進入調(diào)試
-
disable()
針對當前頁面禁用調(diào)試能力
-
setBreakpointsActive(active:boolean)
激活當前頁面的所有斷點
-
setSkipAllPauses(skip:boolean)
使當前頁不會被任何暫停事件所中斷,如斷點早处、異常湾蔓、dom異常等
-
setBreakpointByUrl
參數(shù):
lineNumber:integer
url:string optional 設(shè)置斷點的目標腳本url
urlRegex:string optional 匹配正則表達式的url
columnNumber:integer optional
condition:string optional 設(shè)置斷點條件返回值:
{breakpointId:BreakpointId,locations:[Location]}在給定url的javascript文件中設(shè)置斷點。一旦該命令得到執(zhí)行砌梆,將返回斷點id默责,和應(yīng)用該斷點的文件位置贬循。url和urlRegex必須得設(shè)置一個。
-
setBreakpoint
參數(shù):
location:Location
condition:string返回:
{breakpointId:BreakpointId,actualLocation:Location}在給定的Location處設(shè)置斷點
-
removeBreakpoint(breakpointId:BreakpointId)
刪除斷點
-
continueToLocation(location:Location)
繼續(xù)執(zhí)行傻丝,直到到達目標位置
stepOver()
stepInto()
stepOut()
pause()
resume()
-
searchInContent
參數(shù):
scriptId:Runtime.ScriptId 搜索目標腳本的id
query:string 搜索內(nèi)容
caseSensitive:boolean optional 是否大小寫敏感
isRegex:boolean optional 是否使用正則表達式返回:
{result:[SearchMatch]}在指定目標腳本里搜索字符串甘有,該方法屬于體驗性方法
-
setScriptSource
參數(shù):
scriptId:Runtime.ScriptId
scriptSource:string 新的腳本內(nèi)容
dryRun:boolean optional 如果設(shè)置為true,改變不會被真正被應(yīng)用葡缰。經(jīng)常用來獲取結(jié)果而并不真正去改變代碼返回:
{
callFrames:[CallFrame], //optional 如果編輯發(fā)生了,返回新的棧幀
stackChanged:boolean, //optional 當前調(diào)用棧是否被改變
asyncStackTrace:Runtime.StackTrace //optional 異步的stack trace忱反,如果有的話
exceptionDetails:Runtime.ExceptionDetails //optional 異常信息泛释,如果有的話
}編輯腳本內(nèi)容
-
restartFrame
參數(shù):
callFrameId:CallFrameId 棧幀id返回:
{
callFrames:[CallFrame] //新的stack trace
asyncStackTrace:Runtime.StackTrace
}重新從某一棧幀開始執(zhí)行
-
getScriptSource(scriptId:Runtime.ScriptId)
返回:
{
scriptSource:string
}獲取腳本內(nèi)容
-
setPauseOnExceptions
參數(shù):
state:string 只能設(shè)置三個值:none, uncaught, all.定義在什么異常情況下暫定,默認是none温算。all為任何異常都暫停怜校。
-
evaluateOnCallFrame
參數(shù):
callFrameId:CallFrameId
expression:string 表達式內(nèi)容
objectGroup:string optional 將結(jié)果放在哪個分組下
includeCommandLineAPI:boolean optional 指定表達式是否應(yīng)該存在命令行api,默認false
silent:boolean optional 在靜默狀態(tài)下注竿,表達式評估異常不會報告且不會造成暫定
returnByValue:boolean optional 是否期望返回結(jié)果是json對象
generatePreview:boolean optional 是否生成結(jié)果預(yù)覽茄茁,體驗性參數(shù)返回:
{
result:Runtime.RemoteObject
exceptionDetails:Runtime.ExceptionDetails//optional
}在指定棧幀評估表達式
-
setVariableValue
參數(shù):
scopeNumber:integer 域序號,基于0巩割。只運行l(wèi)ocal裙顽、closure、catch域宣谈。
variableName:string 變量名
newValue:Runtime.CallArgument 新的變量值
callFrameId:CallFrameId指定棧幀上設(shè)置某變量的值
-
setAsyncCallStackDepth
參數(shù):
maxDepth:integer 異步調(diào)用棧的最大深度愈犹,,默認為0闻丑,不去收集異步調(diào)用棧禁用或啟用異步調(diào)用棧的跟蹤
-
setBlackboxPatterns
體驗性 略
-
setBlackboxedRanges
體驗性 略
事件
-
scriptParsed
虛擬機解析腳本時觸發(fā)
參數(shù):
scriptId:Runtime.ScriptId
url:string
startLine:integer
startColumn:integer
endLine:integer
endColumn:integer
executionContextId:Runtime.ExecutionContextId 腳本的執(zhí)行上下文
hash:string
executionContextAuxData:object optional
isLiveEdit:boolean optional 腳本是否來自動態(tài)改變的內(nèi)容漩怎。體驗性。
sourceMapURL:string optional source map的url
hasSourceURL:boolean optional 腳本是否存在source url -
scriptFailedToParse
虛擬機解析腳本失敗時觸發(fā)
參數(shù):
scriptId:Runtime.ScriptId
url:string
startLine:integer
startColumn:integer
endLine:integer
endColumn:integer
executionContextId:Runtime.ExecutionContextId 腳本的執(zhí)行上下文
hash:string
executionContextAuxData:object optional
sourceMapURL:string optional source map的url
hasSourceURL:boolean optional 腳本是否存在source url -
breakpointResolved
當一個斷點在某腳本的目標位置得帶應(yīng)用時觸發(fā)
參數(shù):
breakpointId:BreakpointId
location:Location -
paused
當虛擬因異赤挛耍或斷點或其它緣由暫停時
參數(shù):
callFrames: [ CallFrame ] 虛擬機停止在哪個棧
reason:string 原因(包括XHR, DOM, EventListener, exception, assert, debugCommand, promiseRejection, other).
data:object optional 輔助屬性
hitBreakpoints:[string] optional hit到的斷點id
asyncStackTrace:Runtime.StackTrace optional -
resumed
虛擬機恢復(fù)運行時觸發(fā)
類型
-
BreakpointId
斷點id
string -
CallFrameId
調(diào)用棧id
string -
Location
代碼位置
object
屬性:
scriptId:Runtime.ScriptId
lineNumber:integer
columnNumber:integer optional -
CallFrame
棧幀
object
屬性:
callFrameId:CallFrameId
functionName:string 函數(shù)名
functionLocation:Location optional 體驗性
location:Location
scopeChain:[Scope] 該幀的調(diào)用域鏈
this:Runtime.RemoteObject 該幀的調(diào)用者
returnValue:Runtime.RemoteObject optional 如果該幀處于函數(shù)返回點將得到返回值 -
Scope
執(zhí)行域
object
屬性:
type:string 包括:global, local, with, closure, catch, block, script
object:Runtime.RemoteObject 代表該執(zhí)行域的對象勋锤,對global和with域來說代表真正的對象,對于其他域只是該域的描述侥祭,包括了域里的屬性和變量
name:string optional
startLocation:Location
endLocation:Location -
SearchMatch
搜索匹配結(jié)果
object
屬性:
lineNumber:number 所在行
lineContent:string 匹配的內(nèi)容