如何在Xcode中为协议方法设置断点以捕获所有实现类调用
给协议方法全局设置断点的实用方案
嘿,我完全懂你这种痛点——自定义框架里一堆遵循协议的类,一个个加断点根本不现实!之前Xcode编辑器里设的断点没触发,是因为它只会给协议的默认实现(如果有的话)加断点,不会覆盖所有遵循类的独立实现。试试下面这两个靠谱方法,轻松捕获所有调用:
方法一:用LLDB命令快速搞定
LLDB的正则断点能直接匹配所有遵循协议的对象调用目标方法的情况,步骤超简单:
- 先把App运行起来,随便找个地方暂停(比如设个初始断点,或者在LLDB控制台敲
process interrupt中断进程) - 在LLDB控制台输入对应的命令:
- 如果你用的是Objective-C协议,比如协议叫
MyProtocol,方法是doSomething,就敲:breakpoint set -r "\[-[<MyProtocol> doSomething]\]" - 如果是Swift协议,先让App调用一次目标方法,再用
image lookup -n doSomething查看方法的具体符号,接着用正则匹配,比如:breakpoint set -r ".*doSomething.*"
- 如果你用的是Objective-C协议,比如协议叫
- 敲
continue继续运行App,之后只要有遵循该协议的对象调用doSomething,调试器就会自动触发中断!
方法二:用Xcode的符号断点可视化设置
如果你更习惯用Xcode界面操作,试试符号断点:
- 打开断点导航器(快捷键Cmd+8),点击左下角的「+」号,选择「Symbolic Breakpoint」
- 在「Symbol」输入框里填对应的正则表达式:
- OC协议填
-[<MyProtocol> doSomething] - Swift协议可以填你查到的具体方法符号,或者用
.*doSomething.*(如果怕同名方法干扰,就用更精确的正则)
- OC协议填
- 其他选项保持默认就行(如果需要过滤特定条件,可以在「Condition」里设置),然后点击「Done」
- 重新运行App,所有遵循协议的对象调用该方法时都会触发断点啦
小提示
- 如果方法带参数,记得把参数部分也加到正则里,比如OC的
-[<MyProtocol> doSomethingWithParam:],Swift的doSomething(with:)对应的符号 - 要是不确定方法的准确符号,先让App调用一次该方法,然后在LLDB里用
image lookup -n 方法名就能查到所有相关符号,再针对性设置断点就不会错啦
内容的提问来源于stack exchange,提问作者Cristik
相关产品推荐
相关产品推荐

