Xcode多进程调试:WKWebView
由于WKWebView使用的是多线程架构,渲染模块和网络模块都各自在一个单独的进程里面,因此,如果需要设置渲染模块或者网络模块里面的断点,需要做一些特殊处理。
举个例子,假设在Xcode里面设置了渲染模块里面一个函数的符号断点:

如果像平时一样,运行工程期待断点生效是不可能的。这是因为默认情况下,这个断点是在主进程,例子里面是TestWKServer进程,而主进程是没有上面的RenderElement函数的,因此不会触发断点。
正确的操作是要将WKWebView的渲染进程和网络进程Attach到Xcode里面。方法就是选择Xcode的Debug菜单,然后选择Attach to Process by PID or Name...或者Attach to Process。

选择Attach to Process by PID or Name...需要填入进程的PID或者进程的名字,对于WKWebView的渲染进程和网络进程来说,它们的名字分别是com.apple.WebKit.WebContent、com.apple.WebKit.Networking。
选择Attach to Process会展开所有的进程列表,选择需要Attach的进程就行。
那么,这两种有什么差别呢?
由于Attach to Process需要被Attach的进程已经创建才行,但是我们有时候可能等进程被创建完毕才去Attach就会错过断点执行的时机,这时候Attach to Process by PID or Name...就会显得很有用了。Attach to Process by PID or Name...在被Attach的进程还未创建时,就告诉Xcode:"我需要Attach这些进程,请在它们创建之后就立即Attach进来",这样就不会错过任何断点时机了。
但是需要注意的是,由于你在调试的时候,可能开着诸如Safari一类的程序,由于Safari使用WKWebView,也会有渲染进程和网络进程,当你通过Attach to Process by PID or Name...设置了需要Attach的进程名字,然后启动你的工程,会发现Xcode确实Attach了渲染进程和网络进程,但是Attach的确是Safari的而不是你自己的(因为Safari的渲染进程和网络进程先于你的创建),这时候断点也不会生效。
有两种办法解决上述问题:
1)退出Safari之类使用WKWebView的程序,确保除了自己的工程之外,不会有其他程序已经创建了WKWebView的渲染进程和网络进程。确认的方式是使用Attach to Process提供的进程列表,确认里面没有com.apple.WebKit.WebContent com.apple.WebKit.Networking进程;
2)使用Attach to Process,但是需要确保我们Attach的时候,程序还未执行我们想要断点的函数。一个比较有用的方法是先在WKNavigationDelegate的- webView:decidePolicyForNavigationAction:preferences:decisionHandler:实现函数里面设置一个断点,当断到这个函数时,渲染进程和网络进程已经创建,并且这两个进程也还刚刚开始运行,一般来说,我们也来得及设置后续我们需要设置的断点。这个时候就可以使用Attach to Process去Attach我们自己的渲染进程和网络进程,一个好用的规律是我们自己的渲染进程和网络进程是主进程的子进程,它们的PID非常相似(或者说相近),如果实在不确定哪个进程是我们自己的,就将列表里面所有的com.apple.WebKit.WebContent、com.apple.WebKit.Networking进程Attach进来,只是这样比较繁琐。
Xcode多进程调试:WKWebView的更多相关文章
- Xcode 7 调试野指针利器 Address sanitizer
Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error dete ...
- xcode的调试技巧
转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global ...
- Xcode视图调试
视图调试 使用视图调试器检查您的视图层次结构,可以轻松地判断视图位置.大小以及实现问题. 在XCode中运行你的应用程序,在调试栏上点击“调试视图层次”按钮,进入视图调试器. XCode停止你的应用程 ...
- 如何使用Xcode分析调试在真机运行的UE4 IOS版游戏
写本文的是因为UE4 官方文档虽然也有,但主要讲的是是用UE4Editor把游戏打成一个IPA包的形式发布的方法 而对于想通过Xcode分析UE4的渲染流程来学习或优化的朋友,那官方文档的资料还是不够 ...
- GDB多进程调试(转)
http://www.cnblogs.com/ggjucheng/archive/2011/12/15/2288710.html GDB 是 linux 系统上常用的 c/c++ 调试工具,功能十分强 ...
- GDB 多进程调试
启动: $gdb <file> || $gdb 然后(gdb)file <file> 运行: (gdb)run <该程序本身的命令行参数> 查看代码: (gdb) ...
- xcode单步调试快捷键
xcode单步调试快捷键f6,但是磨人f6是用来调节键盘亮度的,在系统偏好,键盘设置里面,做如下设置就可以了.
- iOS开发之Xcode常用调试技巧总结
转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...
- 使用Xcode进行调试
目录 知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global BreakPoint) 条件断点(Condational Breakpoints)打印的艺术 NSLog 开启僵尸对象(Enab ...
- 2019-10-11-VisualStudio-配置多进程调试快捷键启动项目
title author date CreateTime categories VisualStudio 配置多进程调试快捷键启动项目 lindexi 2019-10-11 15:33:32 +080 ...
随机推荐
- #线性dp#CF1110D Jongmah
题目 分析 考虑三个 \((i,i+1,i+2)\) 可以用 \((i,i,i)\) 和 \((i+1,i+1,i+1)\) 和 \((i+2,i+2,i+2)\) 代替, 所以这样的三元组本质上最多 ...
- Gitee码云:用git上传本地文件到码云gitee的方法
首先登录码云 https://gitee.com/,注册一个账号,并登录账号. 1. 在码云上创建项目 在码云首页顶部,下图所示,右上角头像旁边的加号,鼠标移上去会显示下拉的,点击"新建项目 ...
- Centos环境部署SpringBoot项目
centos JDK Jenkins maven tomcat git myslq nginx 7.9 11.0.19 2.418 3.8.1 9.0.78 2.34.4 5.7.26 1.24.0 ...
- MySQL的下载、安装和配置
一.MySQL的下载 下载地址:http://dev.mysql.com/downloads/mysql 进入下载页面,选择所需版本,这里示范MySQL8.0 图一 选择版本,下载MSI(软件安装 ...
- (数据科学学习手札159)使用ruff对Python代码进行自动美化
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,在日常编写Python代码的过 ...
- MVC如何创建区域
前言 MVC 划分区域可以为项目成立不同的小模块,方便团队之间开发,与增强项目结构的清晰度. 正文 建立区域: 在areas里面建立区域.,然后填写命名. 然后区域注册即可: 但是这样做依然无法解决项 ...
- locust分布式压测的Step Load及no web模式下的报表自动生成
Running Locust in Step Load ModeIf you want to monitor your service performance with different user ...
- 使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权
视频地址:[WebApi+Vue3从0到1搭建<权限管理系统>系列视频:搭建JWT系统鉴权-哔哩哔哩] https://b23.tv/R6cOcDO qq群:801913255 一.在ap ...
- 函数模板 及显式具体化(C++)
函数模板 将同一种算法应用与不同类型的函数时 #include<iostream> #include<string> template <typename T> v ...
- AGC066 题解
题解:AT_agc066_a [AGC066A] Adjacent Difference 笑点解析:没有必要将总成本最小化. 我们将格子间隔的黑白染色(显然有两种染色方法),对于黑点我们要求它是奇数倍 ...