特定URL

时间:2018-02-04 13:37:33

标签: ios objective-c swift xcode lldb

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

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

Adding symbolic breakpoint

然后程序停止:

enter image description here

所以,问题是:

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

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

1 个答案:

答案 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