URL特定 URL 处的会话 dataTask 符号断点

URLSession dataTask symbolic breakpoint at specific URL

我有一个 API 包装器,它正在记录 URLSession 请求的所有 URL。我需要在特定的 URL 调用处设置断点,以便能够轻松地在 UI 中找到一个位置,从那里初始化 API 调用。

停在任何URLSession dataTask都没有问题。我正在使用 lldb 命令 br set -F '-[__NSCFURLSessionTask resume]':

然后程序停止:

所以,问题:

有没有办法从上面截图的上下文中获取URL,将其与提供的URL匹配,如果URL不匹配则继续?

或者其他一些想法(例如lldb python 脚本)?

让我们从计算断点处的instance指针值开始。 由于 Objective-C selectorSwift .resume() 调用中发送,我们必须回退到实际实现:

objc_msgSend(receiver, selector, arg1, arg2, ...)

在不深入细节的情况下,我们依靠 MacOS/iOS ABI 指定哪些 cpu 寄存器用于传递参数。我们特别感兴趣的是找到 receiver instance pointer 值的第一个参数。

Private class __NSCFURLSessionTask恰好有如下方法:

- (NSURL*)currentRequest_URL;

@JimIngham 指出了一个惊人的捷径来实现这一点,通用参数同义词是 $arg1 $arg2 ... in lldb。 (注意选择器的 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