调试 WebKit

进程

WebKit 系统框架在 Mac 和 iOS 上都导出了两个公共 API:一个现代的多进程 API (WKWebView) 和一个传统的单进程 API (Mac 上的 WebView 和 iOS 上的 UIWebView)。与在单个进程中执行的传统 API 不同,现代 WebKit API 的功能在 UIProcess(例如 Safari)和以下辅助进程之间进行了隔离

常用名称 进程名称 用途
WebProcess com.apple.WebKit.WebContent.Development 核心引擎
NetworkProcess com.apple.WebKit.Networking.Development 网络
StorageProcess com.apple.WebKit.Storage.Development IndexedDB/Service Worker 存储

代码库是围绕这些进程边界组织的。您需要附加到相应的进程才能调试问题。

日志

WebKit 默认会输出大量日志。您可以通过将环境变量 OS_ACTIVITY_MODE 设置为以下值之一来更改日志的详细程度

描述
disable 禁用所有日志记录和活动跟踪(无法覆盖)
off 在进程启动时开启所有日志记录和活动跟踪(可被工具覆盖)
info 信息级别日志
debug 调试级别日志

iOS 模拟器

在终端中,运行以下命令以附加到当前正在运行的 MobileSafari

xcrun --sdk iphonesimulator lldb --attach-name MobileSafari

使用 --wait-for 选项等待 MobileSafari 启动并尽早附加到它。

xcrun --sdk iphonesimulator lldb --attach-name MobileSafari --wait-for

com.apple.WebKit.WebContent.Development 替换 --attach-name 的值以调试 WebProcess。

macOS

内部调试菜单

Safari 中有一个可以启用的调试菜单,它提供了许多有用的选项来帮助调试。要启用它,请在终端中运行以下命令

defaults write com.apple.Safari IncludeInternalDebugMenu 1

从终端调试 UIProcess

运行脚本 debug-safaridebug-minibrowser。它将分别以 Safari 或 MiniBrowser 作为目标启动调试器。在调试器提示符下,输入 run 以启动进程。

使用 Xcode 调试

要在 Xcode 中调试,您可以使用 WebKit 工作区。通过选择“文件”>“工作区设置”,然后单击“高级”按钮,选择“自定义”、“相对于工作区”,并为“产品”、“中间文件”和“索引数据存储”输入“WebKitBuild”,确保工作区的产品、中间文件和索引数据存储位置与 build-webkit 使用的位置匹配。请注意,如果您在 Xcode 首选项中指定了自定义构建位置,则无需执行此操作。

调试 UIProcess

  1. 打开 WebKit Xcode 工作区
注意:Xcode 项目文件取决于项目本身指定的构建位置。要在从命令行构建 WebKit 和 Xcode 之间进行切换,您必须确保两者使用相同的构建目录。请参阅上文说明。
  1. 设置项目的构建产品位置

    为了找到您构建的 WebKit,Xcode 需要知道 build-webkit 使用的构建产品位置。您可以在项目的构建设置编辑器中设置构建产品位置。

  2. 设置项目的活动方案

    Xcode 还需要知道您使用的构建配置。您可以从工作区窗口设置活动方案。

  3. 将 Safari 添加到项目的活动方案

    从方案弹出菜单中选择“编辑方案”。在窗口最左侧的窗格中,选择“运行”。在“信息”窗格中,从“可执行文件”弹出菜单中选择“其他”。然后选择 /Applications/Safari.app

  4. 启动调试器

    在工作区窗口中,单击“运行”按钮。

  5. 有关使用 Xcode 在 macOS 上调试软件的更多信息,请参阅调试工具

调试 WebProcess

当前版本的 Safari 为每个标签页使用一个进程,因此很容易出现新的 WebProcess 并需要重新附加。如果按照上述说明启用内部调试菜单,您可以让 Safari 显示每个标签页的 WebProcess 进程 ID。只需前往“调试”>“杂项标志”,然后选择“在页面标题中显示 Web 进程 ID”。您现在应该会在导航到的每个网页标题中看到类似 [WP 60737] 的内容,其中 60737 是该标签页对应的 WebProcess 的进程 ID。

打开 WebKit 工作区,并从工具栏中的“方案”弹出菜单中选择“所有源(目标 WebProcess)”,然后选择“产品”>“运行”。如果 WebKit 已经构建,则选择“产品”>“执行操作”>“不构建运行”会更快。