有时,当您的项目包含非常不受托管的代码时,就会发生这种情况,因此您无法弄清楚如何解决一个简单的问题。在大多数情况下,调试器可以帮助我们到达根源,我只是想知道 xcode 调试器有多强大。当我使用像 OllyDbg 这样的 asm 调试器时,这些为我们提供了一个不。我最常用的断点选项是单击事件或点击事件上的断点。那么有没有办法在 xcode 项目上放置类似的断点?
听起来你正在寻找一种陷阱的方法anyUIButton 被点击的时间。为此,我将设置一个符号断点。在断点导航器 (⌘7) 中,单击屏幕底部的加号并选择添加符号断点
在对话框中,将以下内容添加到Symbol field:
-[UIControl sendAction:to:forEvent:]
这比你要求的要多一点。实际上,除了 UIButton 之外,它还会捕获来自许多事物的所有事件。不过,我敢打赌您可以让它满足您的需求。现在运行应用程序并点击一个按钮。当它到达断点时,调试器看起来与您可能习惯看到的正常堆栈跟踪略有不同,因为您将在没有源代码匹配符号的位置处到达断点。只需几个命令,您就可以破译相当多的内容。例如,请参见下面的屏幕截图。
这就是我所做的,以及其中的一些含义。第一件事是跳到 (F6) 到下一个命令的开头(例如第 12 行),以确保传入变量的所有寄存器都已正确填充。从那里开始,我开始在寄存器中挖掘有趣的信息。在此示例中,寄存器 r15 是调用对象(按钮!),r14、r12 和 rbx 是参数(第 4 - 7 行)。当寄存器中的值是指向对象的指针时,您可以像在“正常”堆栈帧中一样“打印对象”。例如。:
(lldb) register read r15
r15 = 0x00007fc6f4a24510
(lldb) po 0x00007fc6f4a24510
<UIButton: 0x7fc6f4a24510; frame = (0 0; 414 100); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x7fc6f4a247b0>>
(lldb) po [[(UIButton *)0x00007fc6f4a24510 titleLabel] text]
Done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)