LLDB调试系统扩展时如何查找可添加断点的目标函数?
lldb调试系统扩展断点问题解决方案
一、列出系统扩展的所有可用函数
可通过lldb的镜像查询命令实现,操作步骤如下:
- 确保lldb已经attach到目标系统扩展对应的进程,或已经加载扩展的二进制符号
- 执行命令查看扩展是否已被lldb识别:
image list
在输出中找到你的系统扩展对应的二进制路径,记录下文件名 - 列出该扩展下的所有函数符号:
image lookup -rn . --shlib <扩展二进制文件名>
命令中.为匹配所有符号的正则,--shlib参数限定只查询目标扩展的符号,避免输出其他系统库的无关内容。
二、成功给processEvent函数添加断点的方法
你遇到的no locations (pending)报错,核心原因是lldb无法通过你输入的短名称processEvent匹配到对应符号,可通过以下几种方案解决:
方案1:使用完整符号名加断点
FilterDataProvider processEvent是类成员方法,符号会携带类名、方法类型前缀:
- 如果是Objective-C实例方法,执行:
b "-[FilterDataProvider processEvent]" - 如果是Objective-C类方法,执行:
b "+[FilterDataProvider processEvent]" - 如果不确定方法类型/是否带参数,可使用正则匹配加断点,同时限定只在目标扩展中查询:
b -r 'processEvent' --shlib <扩展二进制文件名>
方案2:通过地址加断点(准确率最高)
直接使用IDA反编译得到的函数偏移计算实际内存地址加断点,不受符号名称匹配问题影响:
- 在IDA中找到
processEvent函数的相对偏移(相对于二进制文件基址的偏移值) - 在lldb中查询目标扩展的实际加载基址:
image list -o <扩展二进制文件名> - 将加载基址和IDA中的相对偏移相加,得到函数的实际内存地址,执行断点命令:
b *<计算得到的实际内存地址>
注意事项
调试系统扩展前需要先关闭SIP的调试限制,否则lldb无法读取系统扩展的符号信息,也无法正常添加断点。
内容的提问来源于stack exchange,提问作者festivezine
相关产品推荐
相关产品推荐

