ios - URLSession dataTask 特定 URL 处的符号断点

标签 ios objective-c swift xcode lldb

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

在任何URLSession dataTask 处停止都没有问题。我使用 lldb 命令 br set -F '-[__NSCFURLSessionTaskresume]' 来执行此操作:

Adding symbolic breakpoint

然后程序停止:

enter image description here

所以,问题是:

有没有办法从上面屏幕截图的上下文中获取 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/

相关文章:

ios - 如何彻底重命名 Xcode 中的通用框架?

ios - Xcode 无限期 "Attaches to AppName"

ios - 如何在 UIView (iOS) 中绘制心形?

ios - 使用 NSSet 从 NSMutableArray 中删除重复项

html - Objective-c:如何在没有 UIWebView 的情况下在 iOS 中将 html <img> 标签显示为图像

ios - cell.selected 不起作用

ios - Swift:如何防止两个表格单元格同时被滑动?

ios - UIBezierPath子类初始化器

ios - iOS 中特定字符串的 SHA1

objective-c - 在 Swift 2.1 中使用在 Objective C 中声明为 block 的闭包 Swift