繁体   English   中英

URLSession dataTask 特定 URL 处的符号断点

[英]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指针值开始。 由于在Swift .resume()调用中发送了一个Objective-C selector ,因此我们必须回.resume()以下实际实现:

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

无需赘述,我们依靠 MacOS/iOS ABI 指定哪些 CPU 寄存器用于传递参数。 我们对查找receiver instance指针值的第一个参数特别感兴趣。

私有__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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM