如何在WebKit函数上的Xcode中设置符号断点

时间:2018-11-09 22:57:38

标签: ios xcode webkit breakpoints

为了对问题进行分类,我试图在C ++函数的Xcode中设置一个符号断点,但从未成功(我使用调试版本尝试了实时设备和模拟器)。

我正在使用符号化堆栈跟踪中列出的函数名称。例如:

  

WebKit :: WebLoaderStrategy :: loadResourceSynchronously +

是否有任何技巧可以使它正常工作?

虽然我认为可以构建WebKit,但我认为这没有用,因为我无法使用WebKit版本重建iOS。但是我假设至少这些符号将与崩溃日志的堆栈跟踪中的符号(以及Git上WebKit的源代码)相匹配。

更新,如果我只是在“ loadResourceSynchronously”中输入,它将自动找到以下符号:(由于某些原因,剪切和粘贴无效,因此将使用图像)

enter image description here

这似乎表明Xcode可以理解这些符号。但是我从来没有看到他们中的任何一个被人称呼。根据我发现的崩溃跟踪,我很确定应该调用它们。

1 个答案:

答案 0 :(得分:0)

我想出了这个粗暴解决方法,但是可以完成一些工作。
我在以下方面(从XCode 10.1版本开始)找到了针对特定于模拟器的WebKit的逆向工程二进制文件(Demo Hopper就足够了)提供了大力帮助:

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks

了解二进制文件的组织方式以及内部内容(以什么顺序排列)。

here的WebKit源代码也很有用

因此,从根本上说,解决方法归结为在一些现有的公共或私有objc方法上设置一些断点。在您的应用程序运行期间,例如:

br s -F "-[WKWebView _isPlayingAudio]"

这将为您提供WebKit中此方法的地址:

Breakpoint 11: where = WebKit`-[WKWebView(WKPrivate) _isPlayingAudio], address = 0x00000001e7ed3f3c

现在出现了粗俗的把戏:

di -s 0x00000001e7ed3f3c -c 1000000

这使用非常激进的-c设置来深入了解WebKit的内存(这将需要一些时间!)。这将为您带来很好的反汇编,包括C ++符号,例如:

WebKit`WebKit::WebPageProxy::activityStateDidChange:
->  0x1e7f5dbe4 <+0>:     stp    x20, x19, [sp, #-0x20]!

将调试器输出输出到您喜欢的文本编辑器中以搜索符号。如果您很幸运,现在就知道地址。如果是这样,您可以使用:

di s -a 0x1e7f5dbe4

实际设置一个断点。

踏入功能也可能会加快速度,因为反汇编中会用诸如此类的东西进行注释:

0x1e7f5dc78 <+148>:   b      0x1e23543ac               ; WebCore::RunLoopObserver::schedule(__CFRunLoop*, unsigned long)
0x1e7f5dc88 <+164>:   b      0x1e7f5dc8c               ; WebKit::WebPageProxy::dispatchActivityStateChange()