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 ...
随机推荐
- linux系统执行 ifconfig命令ens33没有显示ip地址解决办法
问题背景 安装虚拟机(以ubuntu为例)因为重启或更新等原因导致,无法通过ssh连接到虚拟机,本地cmd窗口ping虚拟机ip发现无法ping通 启动本地虚拟机 发现ens33 位置没有显示 ip地 ...
- Web、Android等程序开发中src引入外部文件和资源的方法总结
方法一:使用相对于当前文件(源文件)的相对路径 使用 ../ 对于这个例子来说 ../ 把路径带到了项目根目录的下一级目录 1 <script src="../static/js/wo ...
- Git 分支管理:优化版本控制与应急处理的关键策略
使用 Git 分支:轻松管理不同版本和应对紧急情况的最佳实践 使用 Git 分支 在 Git 中,分支是主仓库的新/独立版本. 假设你有一个大型项目,需要对其进行设计更新. 没有使用 Git 时: 复 ...
- RabbitMQ 09 主题模式
主题模式 主题模式结构图: 主题模式实际上就是一种模糊匹配的模式,可以将routingKey以模糊匹配的方式去进行转发. 可以使用*或#来表示: *:任意的一个单词. #:0个或多个单词. 定义配置类 ...
- 构筑立体世界,AR Engine助力B站会员购打造沉浸式营销
随着购物场景的逐渐多元化,越来越多电商平台把线下购物体验搬到线上,运用AR技术,跨越空间距离,帮助用户在购买前"体验"商品,增强购买意愿. 哔哩哔哩会员购(后称会员购)是B站于20 ...
- Counter 1000
From a 1000 Hz clock, derive a 1 Hz signal, called OneHertz, that could be used to drive an Enable s ...
- 解密prompt系列27. LLM对齐经验之如何降低通用能力损失
前面我们已经聊过众多指令微调的方案,这一章我们重点讨论下如何注入某一类任务或能力的同时,尽可能不损失模型原有的通用指令理解能力.因为在下游或垂直领域应用中,我们设计的推理任务风格或形式,往往很难通过p ...
- VIM YouCompleteMe(ycm) 对于Python3第三方库的自动补全【部分解决】
VIM YouCompleteMe(ycm) 对于Python3第三方库的自动补全[部分解决] Python3 学习笔记 问题:VIM 用YouCompleteMe(ycm)自动补全插件时,只能支持P ...
- 重新点亮shell————awk函数[十五]
前言 简单介绍一下awk函数. 正文 算术函数 字符串函数 自定义函数 例子: 结 awk就到这里了.
- c# 模拟web请求formdata webrequest
前言 在写代码中,我们常常需要去书写代码去请求一些东西,那么是不是可以模拟像web formdata一样请求. 正文 下面代码为模拟的: public string SendRequest(strin ...