为了对问题进行分类,我试图在C ++函数的Xcode中设置一个符号断点,但从未成功(我使用调试版本尝试了实时设备和模拟器)。
我正在使用符号化堆栈跟踪中列出的函数名称。例如:
WebKit :: WebLoaderStrategy :: loadResourceSynchronously +
是否有任何技巧可以使它正常工作?
虽然我认为可以构建WebKit,但我认为这没有用,因为我无法使用WebKit版本重建iOS。但是我假设至少这些符号将与崩溃日志的堆栈跟踪中的符号(以及Git上WebKit的源代码)相匹配。
更新,如果我只是在“ loadResourceSynchronously”中输入,它将自动找到以下符号:(由于某些原因,剪切和粘贴无效,因此将使用图像)
这似乎表明Xcode可以理解这些符号。但是我从来没有看到他们中的任何一个被人称呼。根据我发现的崩溃跟踪,我很确定应该调用它们。
答案 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()