SavedFrame

SavedFrame 实例是一个单向链接的堆栈帧列表。它表示过去某个执行时刻的 JavaScript 调用堆栈。较新的帧持有对调用它们的帧的引用。较旧的尾部在许多较新的帧之间共享。

SavedFrame 堆栈通常应该在正在观察或调试的隔间中捕获、分配和生存。通常这是一个内容隔间。

捕获 SavedFrame 堆栈

从 C++

使用 JS::CaptureCurrentStack,它在 jsapi.h 中声明。

从 JS

使用 saveStack,可以通过 Components.utils.getJSTestingFunction() 访问。

包含和排除 Chrome 框架

考虑以下 SavedFrame 堆栈。箭头表示从子帧到父帧的链接,content.js 来自具有内容权限的隔间,而 chrome.js 来自具有 Chrome 权限的隔间。

function A from content.js
            |
            V
function B from chrome.js
            |
            V
function C from content.js

内容隔间将始终对该堆栈有一个视图:A -> C

但是,Chrome 隔间可以选择:它可以采用与内容隔间相同的视图 (A -> C),或者它可以查看所有堆栈帧,包括来自 Chrome 隔间的帧 (A -> B -> C)。要查看所有内容,请使用 XrayWrapper。这是默认包装器。要查看内容隔间看到的堆栈,请使用 Components.utils.waiveXrays 取消 X 光包装器。

const contentViewOfStack = Components.utils.waiveXrays(someStack);

SavedFrame.prototype 对象的访问器属性

source

此堆栈帧的源 URL,作为字符串。

sourceId

此源的进程唯一的内部整数 ID。可用于使用其 id 属性将 SavedFrame 与 Debugger.Source 匹配。

line

此堆栈帧的行号。

column

此堆栈帧的列号。

functionDisplayName

SpiderMonkey 推断的此堆栈帧函数的名称,或 null

asyncCause

如果此堆栈帧是其他堆栈帧的 asyncParent,则这是一个表示此帧调用其子项的异步调用的类型的字符串。例如,如果此帧的子项是对此帧创建的 Promise 的处理程序的调用,则此帧的 asyncCause 将是 "Promise"。如果异步调用是在属性请求者无法访问的后代帧中启动的,则这将是通用字符串 "Async"。如果不是异步调用点,则为 null

asyncParent

如果此堆栈帧是作为异步操作的结果调用的,例如,如果此帧引用的函数是 Promise 处理程序,则此属性指向负责异步调用的堆栈帧,例如创建 Promise 的位置。如果调用负责的帧对调用者不可访问,则如果存在,则指向实际帧的最年轻的可访问祖先。在所有其他情况下,这都是 null

parent

此堆栈帧的调用方,或者如果这是堆栈中最旧的帧,则为 null。在这种情况下,可能会有一个 asyncParent 代替。

SavedFrame.prototype 对象的函数属性

toString()

将此帧及其父级格式化为人类可读的堆栈跟踪字符串。