English | 简体中文
debug
transform
resume
evaluate
getPossibleBreakpoints
setBreakpoint
removeBreakpoint
setBreakpointsActive
setExecutionPause
setExceptionPause
getPausedInfo
getScopeChain
getScriptContent
runInNativeEnv
runInSkipOver
setModuleRequest
addEventListener
/removeEventListener
调试脚本。接受两个参数,分别是脚本字符串 script
和调试ID debuggerId
。
其中,脚本字符串可以是源码,也可以是 transform
接口返回的转换结果。而调试ID通常为脚本的URL。调试ID可选,不传时会当作临时脚本,分配随机的调试ID。
该接口会返回执行函数 run
,用于真正地执行脚本,因此可以在 run
调用之前使用 setBreakpoint
等接口编辑断点设置。当传入参数不合法或者当前环境不支持断点调试的时候,该接口会返回 false
。
function debug(script: string, debuggerId?: string): (() => void) | false
转换需要调试的脚本。接受两个参数,分别是脚本字符串 script
和调试ID debuggerId
。
其中,调试ID通常为脚本的URL。调试ID可选,不传时会当作临时脚本,分配随机的调试ID。
该接口会返回转换结果,用于运行时传入 debug
接口进行调试。当传入参数不合法的时候,该接口会返回 false
。
function transform(script: string, debuggerId?: string): string | false
当命中断点暂停时,使用该接口恢复执行。接受一个可选的单步调试参数,可选值为 stepInto
、stepOver
或 stepOut
:
- 不传时默认直接继续执行;
- 传
stepInto
时遇到子函数就进入并且继续单步执行; - 传
stepOver
时遇到子函数时不会进入子函数内单步执行; - 传
stepOut
时执行完当前函数剩余部分,并返回到上一层函数。
该接口返回的布尔值用于标记是否恢复成功。
function resume(type?: ResumeType): boolean
type ResumeType = 'stepInto' | 'stepOver' | 'stepOut'
在特定作用域环境中执行表达式。接受两个参数,分别是表达式字符串 expression
和调用栈ID callFrameId
。
其中,调用栈ID可选,可通过 getPausedInfo
接口或 paused
事件的断点相关信息中作用域链 scopeChain
获取得到。如果传了调用栈ID,将会在对应调用栈的作用域中执行表达式;如果没传,默认在顶层全局作用域中执行表达式。
function evaluate<Result = unknown>(expression: string, callFrameId?: number): Result | false
获取脚本所有可能的断点。接受一个调试ID的参数。
如果获取成功,该接口会返回所有可能的断点信息的数组,包括所有断点的断点ID id
、实际行号 lineNumber
(从1开始) 和实际列号 columnNumber
(从0开始);如果设置不成功,则返回 false
。
function getPossibleBreakpoints(debuggerId: string): Breakpoint[] | false
interface Breakpoint { id: number, lineNumber: number, columnNumber: number }
根据调试ID设置断点,包含两个重载:
- 接受三个参数,分别是调试ID
debuggerId
、行号lineNumber
(从1开始) 和可选条件condition
; - 接受四个参数,分别是调试ID
debuggerId
、行号lineNumber
(从1开始)、列号columnNumber
(从0开始) 和可选条件condition
。
另外,可选条件为一段脚本,当该脚本返回为 true
时会中断执行,如果没有条件,则默认到该脚本对应位置时都中断执行。
如果设置成功,该接口会返回断点信息,包括断点ID id
、实际行号 lineNumber
(从1开始) 和实际列号 columnNumber
(从0开始);如果设置不成功,则返回 false
。
function setBreakpoint(debuggerId: string, lineNumber: number, condition?: string): Breakpoint | false
function setBreakpoint(debuggerId: string, lineNumber: number, columnNumber: number, condition?: string): Breakpoint | false
interface Breakpoint { id: number, lineNumber: number, columnNumber: number }
根据断点ID移除断点。接受一个断点ID的参数,返回的布尔值用于标记是否移除成功。
function removeBreakpoint(id: number): boolean
设置是否启用断点。接受一个布尔值参数,返回的布尔值用于标记设置情况。
function setBreakpointsActive(value: boolean): boolean
设置是否暂停执行。接受一个布尔值参数,返回的布尔值用于标记设置情况。设置为 true
以后,将在接下来要执行的语句前暂停。
function setExecutionPause(value: boolean): boolean
设置在遇到异常时是否暂停执行。接受一个布尔值参数,返回的布尔值用于标记设置情况。设置为 true
以后,将在遇到异常时暂停。
function setExceptionPause(value: boolean): boolean
获取断点信息。当目前处于暂停状态时,返回的当前断点相关信息,包括调试ID debuggerId
、断点ID breakpointId
、行号 lineNumber
(从1开始)、列号 columnNumber
(从0开始)、作用域链 scopeChain
以及调试源码 scriptContent
。当目前没有处在暂停状态时,返回 false
。
其中,作用域链 scopeChain
包括全局、函数和块级作用域,可通过是否有调用帧 callFrame
字段来判断是否是全局或函数作用域。过滤出作用域链中含有调用帧的作用域,即可获得调用栈。
另外,调用帧 callFrame
中的 callFrameId
可传给 evaluate
接口用于在特定作用域下执行表达式。
function getPausedInfo(): PausedInfo | false
interface PausedInfo { breakpointId?: number, reason?: string, data?: any, debuggerId: string, lineNumber: number, columnNumber: number, scopeChain: Scope[], scriptContent: string }
interface Scope { eval: (expression: string) => any, name: string, callFrameId: number, callFrame?: CallFrame }
interface CallFrame { debuggerId: string, lineNumber: number, columnNumber: number }
获取当前作用域链。
function getScopeChain(): Scope[]
interface Scope { eval: (expression: string) => any, name: string, callFrameId: number, callFrame?: CallFrame }
interface CallFrame { debuggerId: string, lineNumber: number, columnNumber: number }
根据调试ID debuggerId
获取调试源码。
function getScriptContent(debuggerId: string): string
在原生环境中执行。接受一个回调函数作为参数。
调试器默认将脚本在内部的沙盒中运行,该接口用于在调试过程中,执行需要在原生环境下运行的代码。
如果执行成功,该接口返回值为回调函数的返回值;如果执行失败,返回 false
。
function runInNativeEnv(callback: () => Return): Return | false
跳过断点执行。接受一个回调函数作为参数。
当命中断点暂停时,如果执行调试脚本,会被阻塞直至断点恢复,该接口用于在暂停情况下,不阻塞直接执行调试脚本,常用于通过 evaluate
接口调用调试脚本时,不阻塞执行以获取相应作用域中的值。
如果执行成功,该接口返回值为回调函数的返回值;如果执行失败,返回 false
。
function runInSkipOver(callback: () => Return): Return | false
设置模块请求函数。接受一个请求函数作为参数,用于覆盖内部的默认请求函数。
当需要import模块时,默认会使用fetch进行请求。如果在不支持fetch的环境使用,或者想自定义模块请求的行为(比如对请求结果进行缓存),可通过该接口进行设置。
其中,请求函数 request
可接受一个模块地址 importUrl
作为入参,并要求返回一个 Promise<string>
包裹的模块脚本文本内容。而模块脚本文本内容可以是转换前的脚本源码字符串,也可以是通过 transform
接口转换后的脚本字符串。
该接口返回的布尔值告知是否设置成功。
function setModuleRequest(request: (importUrl: string) => Promise<string>): boolean
添加或移除事件监听器,接受两个参数,分别是事件 event
和监听函数 listener
。
目前有四个事件,为暂停 paused
、恢复 resumed
、错误 error
和沙盒状态变化 sandboxchange
:
- 暂停事件
paused
会返回断点相关信息,该信息与getPausedInfo
的返回值一致; - 恢复事件
resumed
没有返回值,用于通知执行恢复; - 错误事件
error
会返回错误相关信息,包括错误原因和作用域链; - 沙盒状态变化事件
sandboxchange
会返回沙盒相关信息,包括是否启用了沙盒。
该接口返回的布尔值用于标记是否添加或移除事件监听器成功。
function addEventListener<Event extends keyof EventListener>(event: Event, listener: EventListener[Event]): boolean
function removeEventListener<Event extends keyof EventListener>(event: Event, listener: EventListener[Event]): boolean
interface EventListener {
resumed: () => void,
paused: (pausedInfo: PausedInfo) => void,
error: (errorInfo: ErrorInfo) => void,
sandboxchange: (sandboxInfo: SandboxInfo) => void,
}
interface PausedInfo { breakpointId?: number, reason?: string, data?: any, debuggerId: string, lineNumber: number, columnNumber: number, scopeChain: Scope[], scriptContent: string }
interface ErrorInfo { error: Error, scopeChain: Scope[] }
interface SandboxInfo { enable: boolean }
interface Scope { eval: (expression: string) => any, name: string, callFrameId: number, callFrame?: CallFrame }
interface CallFrame { debuggerId: string, lineNumber: number, columnNumber: number }