如何在 - [UIViewController viewWillAppear]方法中添加符号断点时注销self

时间:2014-08-11 02:50:44

标签: ios xcode debugging

我这样做了,但它总是给出错误:

error: use of undeclared identifier 'self'
error: 1 errors parsing expression

enter image description here

2 个答案:

答案 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类设置断点 -

Symbolic breakpoint for specific UIViewController class

您可以添加一个瘦shim UIViewController子类,然后从中继承所有视图控制器。这将允许您在垫片中指定单个符号断点 -

#import "BreakPointingViewController.h"

@implementation BreakPointingViewController

-(void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}

@end

然后在-[BreakPointingViewController viewWillAppear:]

中添加符号断点