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
selector
在 Swift
.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
我有一个 API 包装器,它正在记录 URLSession
请求的所有 URL。我需要在特定的 URL 调用处设置断点,以便能够轻松地在 UI 中找到一个位置,从那里初始化 API 调用。
停在任何URLSession dataTask都没有问题。我正在使用 lldb
命令 br set -F '-[__NSCFURLSessionTask resume]'
:
然后程序停止:
所以,问题:
有没有办法从上面截图的上下文中获取URL,将其与提供的URL匹配,如果URL不匹配则继续?
或者其他一些想法(例如lldb
python 脚本)?
让我们从计算断点处的instance
指针值开始。
由于 Objective-C
selector
在 Swift
.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