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 ...
随机推荐
- Games101--作业2
说明 该作业主要想实现两个三角形的绘制 绘制结果走样 按照课上所讲的方法,对包围盒里面的所有像素进行判断是否在三角形内,然后着色,这样的结果由于采样频率的问题将导致边缘走样现象的发生 if(!insi ...
- Java 中的异常处理机制的简单原理和应用。
Java 中的异常处理机制的简单原理和应用. 异常是指 java 程序运行时(非编译)所发生的非正常情况或错误. Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根 ...
- WPF实现树形表格控件(TreeListView)
前言 本文将探讨如何利用WPF框架实现树形表格控件,该控件不仅能够有效地展示复杂的层级数据,还能够提供丰富的个性化定制选项.我们将介绍如何使用WPF提供的控件.模板.布局.数据绑定等技术来构建这样一个 ...
- 详解SSL证书系列(9)SSL客户端认证
上一篇介绍了HTTPS和HTTP协议的区别,理解了HTTP加上加密处理和认证以及完整性保护后即是HTTPS,同时HTTPS也是身披SSL外壳的HTTP,那么SSL客户端认证是怎么回事呢?这篇文章我将带 ...
- 本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划项目自 2021 年 10 月 24 日上线以来,在开发者中引发高度关注. 成长计划 ...
- 探索基于WebRTC的有感录屏技术开发流程
第一章:技术原理 WebRTC(Web Real-Time Communication)是一种开放源代码项目,旨在通过浏览器之间的点对点通信实现实时音视频通信.WebRTC利用JavaScript A ...
- Python 集合(Sets)3
Python - 合并集合 在 Python 中,有几种方法可以合并两个或多个集合.您可以使用union()方法,该方法返回一个包含两个集合中所有项的新集合,或使用update()方法,将一个集合中的 ...
- 【FAQ】HMS Core推送服务推送角标的开发及常见问题解答
目录 1.发送消息并显示桌面数字角标. 2.如何清除数字角标? 3.如何设置圆点角标? 4.应用桌面图标角标开关无法开启或未显示开关. 5.推送消息设置了角标字段但未显示角标? 6.未设置角标参数,但 ...
- 前端使用 Konva 实现可视化设计器(3)
github/gitee Star 终于有几个了! 从这章开始,难度算是(或者说细节较多)升级,是不是值得更多的 Star 呢?! 继续求 Star ,希望大家多多一键三连,十分感谢大家的支持~ 创作 ...
- Groovy反序列化链分析
前言 Groovy 是一种基于 JVM 的开发语言,具有类似于 Python,Ruby,Perl 和 Smalltalk 的功能.Groovy 既可以用作 Java 平台的编程语言,也可以用作脚本语言 ...