我有一个API包装器,它记录了URLSession
请求的所有URL。我需要在特定的URL调用中断点,以便在UI中轻松找到位置,从而初始化API调用。
在任何 URLSession dataTask 停止都没有问题。我使用lldb
命令br set -F '-[__NSCFURLSessionTask resume]'
执行此操作:
然后程序停止:
所以,问题是:
有没有办法从上面的屏幕截图中获取上下文中的网址,将其与提供的网址相匹配,如果网址不匹配则继续?
或者其他一些想法(例如lldb
python脚本)?
答案 0 :(得分:2)
让我们从断点处找出instance
指针值开始。
由于在Objective-C
selector
电话中发送Swift
.resume()
,我们必须回退到实际执行:
objc_msgSend(receiver, selector, arg1, arg2, ...)
在没有涉及太多细节的情况下,我们依靠MacOS / iOS ABI指定哪些cpu寄存器用于传递参数。我们特别关注第一个参数,以找到receiver instance
指针值。
私有类__NSCFURLSessionTask
碰巧有以下方法:
- (NSURL*)currentRequest_URL;
@JimIngham指出了一个惊人的快捷方式,通过$arg1 $arg2 ...
中的通用参数同义词为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