“backgroundhangmonitor” ping¶
每当后台挂起监视器监视的线程挂起时,都会捕获堆栈和一些关于挂起的非识别信息。当在所有进程中收集到 50 个此类挂起,或浏览器退出时,会传输此 ping 以及收集到的挂起信息。
此 ping 仅在 nightly 版本中收集,以避免在 Beta 版本中产生大量 ping。
结构
{
"type": "backgroundhangmonitor",
... // common ping data
"environment": { ... },
"payload": {
"timeSinceLastPing": <number>, // uptime since last backgroundhangmonitor ping (ms).
"modules": [
[
<string>, // Name of the file holding the debug information.
<string> // Breakpad ID of this module.
],
...
],
"hangs": [
{
"duration": <number>, // duration of the hang in milliseconds.
"thread": <string>, // name of the hanging thread.
"runnableName": <string>, // name of the runnable executing during the hang.
// Runnable names are only collected for the XPCOM main thread.
"process": <string>, // Type of process that hung, see below for a list of types.
"remoteType": <string>, // Remote type of process which hung, see below.
"annotations": [ ... ], // A list of annotations on the hang, see below.
"pseudoStack": [ ... ], // List of label stack frames and js frames.
"stack": [ ... ], // interleaved hang stack, see below.
},
...
]
}
}
注意
每当当前可运行线程超过 128 毫秒时,就会收集挂起。
进程类型¶
process
字段是一个字符串,表示挂起的进程类型。目前仅针对以下进程发送挂起信息
类型 |
描述 |
---|---|
default |
主进程,也称为浏览器进程 |
tab |
内容进程 |
gpu |
GPU 进程 |
远程类型¶
remoteType
字段是一个字符串,表示挂起的内容进程的类型。因此,仅当 processType
包含 tab
值时,它才不为空。
支持的 remoteType
值在崩溃 ping 文档中进行了说明:远程进程类型。
堆栈跟踪¶
每个挂起对象都包含一个 stack
字段,该字段已填充了挂起线程的交错堆栈跟踪。交错堆栈由一个本机回溯以及额外的帧组成,这些帧交错在一起,表示 chrome JS 和标签堆栈条目。
过去管理标签堆栈和 JS 堆栈的结构称为“PseudoStack”,现在称为“ProfilingStack”。
请注意,此字段仅包含本机堆栈帧、标签堆栈和 chrome JS 脚本帧。如果无法在目标平台上收集本机堆栈,或者堆栈遍历未初始化,则不会存在任何本机帧,并且堆栈将仅包含标签堆栈和 chrome JS 脚本帧。
堆栈中的单个帧要么是原始字符串(表示标签堆栈或 chrome JS 脚本帧),要么是本机堆栈帧。
标签堆栈帧包含来自所有 AUTO_PROFILER_LABEL* 宏实例的静态字符串。此外,还会从所有 AUTO_PROFILER_LABEL_DYNAMIC*_NONSENSITIVE 宏的使用中收集动态字符串。动态字符串只是在空格字符后附加到静态字符串。
当前动态字符串集合如下
静态字符串 |
动态 |
---|---|
ChromeUtils::Import |
关联的 chrome:// 或 resource:// URI |
nsJSContext::GarbageCollectNow |
GC 原因字符串 |
mozJSSubScriptLoader::DoLoadSubScriptWithOptions |
关联的 chrome:// 或 resource:// URI |
PresShell::DoFlushPendingNotifications |
刷新类型 |
nsObserverService::NotifyObservers |
关联的观察者主题 |
本机堆栈帧如下所示
[
<number>, // Index in the payload.modules list of the module description.
// -1 if this frame was not in a valid module.
<string> // Hex string (e.g. "FF0F") of the frame offset in the module.
]
注释¶
annotations 字段是键值对的数组,例如,如果用户在挂起期间正在交互,则 annotations 字段将如下所示
[
[
"UserInteracting",
"true"
]
]
树中当前存在以下注释
名称 |
描述 |
---|---|
UserInteracting |
如果用户正在积极交互,则为“true” |
pluginName |
当前正在运行的插件的名称 |
pluginVersion |
当前正在运行的插件的版本 |
HangUIShown |
如果显示了挂起 UI,则为“true” |
HangUIContinued |
如果在挂起 UI 中选择了继续,则为“true” |
HangUIDontShow |
如果未显示挂起 UI,则为“true” |
Unrecovered |
如果挂起持续到进程退出,则为“true” |
可以通过 用户交互 在运行时添加其他注释。