我这样做了,但它总是给出错误:
error: use of undeclared identifier 'self'
error: 1 errors parsing expression
答案 0 :(得分:5)
如果您对ObjC方法调度的工作方式有所了解,也可以通过打印相应的参数来实现。 ObjC方法调用总有两个人为参数,第一个是“自”变量,第二个是“选择器”;然后是明确的论据。
在arm,arm64和x86_64中,参数在寄存器中传递,即使没有调试信息,也可以通过查看相应的寄存器轻松获取这些值。
为了使这更容易,lldb定义寄存器别名“$ arg1”,“$ arg2”,它们只是当前ABI用于传递第一个,第二个等参数的寄存器的其他名称。因此,如果您已经停止在函数的开头(因此参数仍然在寄存器中,它们被传递到函数中),您可以以ABI独立的方式使用这些名称。
有点冗长的讨论的重点是,在objc方法调用的开头,$ arg1将保存self参数。所以你可以把:
po $arg1
在你的断点命令中,这将取代
po self
如果您没有调试信息。
注意,我强调$ arg1不是第一个参数的值但是参数传递寄存器的原因是,如果已经停止,你试图上升堆栈并使用同样的技巧在更高的帧中打印self ,它会失败。已经执行的帧的传入参数几乎从不留在传入的寄存器中(毕竟,这些寄存器必须被重用来调用较年轻的函数。)但是这将在函数执行开始时起作用。
答案 1 :(得分:3)
我不相信您可以从UIKit框架内的断点访问任何符号信息,因为没有可用的调试信息。如果设置断点并允许调试器打开,您将看到只是提供了一些汇编代码和一组寄存器。
您可以在应用程序中为特定的UIViewController类设置断点 -
您可以添加一个瘦shim UIViewController子类,然后从中继承所有视图控制器。这将允许您在垫片中指定单个符号断点 -
#import "BreakPointingViewController.h"
@implementation BreakPointingViewController
-(void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
}
@end
然后在-[BreakPointingViewController viewWillAppear:]