调试 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-safari
或 debug-minibrowser
。它将分别以 Safari 或 MiniBrowser 作为目标启动调试器。在调试器提示符下,输入 run 以启动进程。
使用 Xcode 调试
要在 Xcode 中调试,您可以使用 WebKit 工作区。通过选择“文件”>“工作区设置”,然后单击“高级”按钮,选择“自定义”、“相对于工作区”,并为“产品”、“中间文件”和“索引数据存储”输入“WebKitBuild”,确保工作区的产品、中间文件和索引数据存储位置与 build-webkit 使用的位置匹配。请注意,如果您在 Xcode 首选项中指定了自定义构建位置,则无需执行此操作。
调试 UIProcess
- 打开 WebKit Xcode 工作区
- 设置项目的构建产品位置
为了找到您构建的 WebKit,Xcode 需要知道
build-webkit
使用的构建产品位置。您可以在项目的构建设置编辑器中设置构建产品位置。 -
设置项目的活动方案
Xcode 还需要知道您使用的构建配置。您可以从工作区窗口设置活动方案。
-
将 Safari 添加到项目的活动方案
从方案弹出菜单中选择“编辑方案”。在窗口最左侧的窗格中,选择“运行”。在“信息”窗格中,从“可执行文件”弹出菜单中选择“其他”。然后选择
/Applications/Safari.app
。 -
启动调试器
在工作区窗口中,单击“运行”按钮。
-
有关使用 Xcode 在 macOS 上调试软件的更多信息,请参阅调试工具。
调试 WebProcess
当前版本的 Safari 为每个标签页使用一个进程,因此很容易出现新的 WebProcess 并需要重新附加。如果按照上述说明启用内部调试菜单,您可以让 Safari 显示每个标签页的 WebProcess 进程 ID。只需前往“调试”>“杂项标志”,然后选择“在页面标题中显示 Web 进程 ID”。您现在应该会在导航到的每个网页标题中看到类似 [WP 60737]
的内容,其中 60737 是该标签页对应的 WebProcess 的进程 ID。
打开 WebKit 工作区,并从工具栏中的“方案”弹出菜单中选择“所有源(目标 WebProcess)”,然后选择“产品”>“运行”。如果 WebKit 已经构建,则选择“产品”>“执行操作”>“不构建运行”会更快。