我有一个 API 包装器,它记录 URLSession
请求的所有 URL。我需要在特定的 URL 调用处设置断点,以便能够轻松地在 UI 中找到初始化 API 调用的位置。
在任何URLSession dataTask 处停止都没有问题。我使用 lldb 命令 br set -F '-[__NSCFURLSessionTaskresume]' 来执行此操作:
然后程序停止:
所以,问题是:
有没有办法从上面屏幕截图的上下文中获取 URL,将其与提供的 URL 进行匹配,如果 URL 不匹配则继续?
或者也许还有其他一些想法(例如lldb
python脚本)?
最佳答案
让我们首先计算断点处的实例
指针值。
由于 Objective-C
selector
是在 Swift
.resume()
调用中发送的,我们必须回退到实际执行:
objc_msgSend(receiver, selector, arg1, arg2, ...)
在不涉及太多细节的情况下,我们依赖 MacOS/iOS ABI 指定哪些 cpu 寄存器用于传递参数。我们特别感兴趣的是第一个参数来查找接收器实例
指针值。
私有(private)类__NSCFURLSessionTask
恰好有以下方法:
- (NSURL*)currentRequest_URL;
@JimIngham 指出了一个惊人的捷径来实现这一点,通用参数同义词是 lldb
中的 $arg1 $arg2 ...
。 (请注意,选择器的 arg1 arg2
将分别是 lldb
的 $arg3 $arg4
)这将其简化为:
po [$arg1 currentRequest_URL]
https://www.google.com
如果 x86
32bit
Simulator
对应于低于 iPhone 5S
的设备,您将使用:
(lldb) x/x $esp+4
0xbff9e050: 0x7874dd70
(lldb) po [0x7874dd70 currentRequest_URL]
https://www.google.com
关于ios - URLSession dataTask 特定 URL 处的符号断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48608630/