“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”

可以通过 用户交互 在运行时添加其他注释。