如何在符号断点中使用lldb登录viewDidLoad?

时间:2018-06-12 10:52:11

标签: ios lldb

我开了一个新项目。该项目可能从GitHub下载。

当我运行项目时。我想记录viewDidload函数,以帮助我查看当前时间显示的控制器。

通过日志,我可以看到加载的不同控制器的顺序。

NSLog((@"%s [Line %d] "), __PRETTY_FUNCTION__, __LINE__);
我在viewDidLoad函数中键入此代码,效果很好。

@implementation STListController

- (void)viewDidLoad {
    [super viewDidLoad];        

    NSLog((@"%s [Line %d] " ), __PRETTY_FUNCTION__, __LINE__);

在控制台中:

  

2018-06-14 12:03:09.740756 + 0800 SwipeTableView [10634:1105858] - [STListController viewDidLoad] [第23行]

然后我设置符号断点

enter image description here

令我惊讶的是,日志错了。断点处的日志不会显示为日志代码。

  

2018-06-14 12:05:58.427936 + 0800 SwipeTableView [10789:1113954] void $ __ lldb_expr(void *)[Line 45]   0x73ef013aaa6a000d

     

2018-06-14 12:06:00.168679 + 0800 SwipeTableView [10789:1113954] void $ __ lldb_expr(void *)[Line 45]   0x73ef013aaa6a000d

     

2018-06-14 12:06:01.858458 + 0800 SwipeTableView [10789:1113954] - [STListController viewDidLoad] [第23行]

如您所见,第三个日志是正确的。

Edit Breakpoint的操作中,NSLog((@"%s [Line %d] "), __PRETTY_FUNCTION__, __LINE__);无法显示相同的日志。代码中的好日志为NSLog((@"%s [Line %d] "), __PRETTY_FUNCTION__, __LINE__);

我正在寻找这个问题。 Logging the class name of all UIViewControllers in a project 最好的答案对我来说是完美的。 我找不到lldb的答案。

1 个答案:

答案 0 :(得分:2)

我不确定你为什么说第三个日志是正确的,或者正是你期望看到的。

您设置断点以在方法-[UIViewController viewDidLoad]中停止程序,因此它在那里停止。现在,当lldb运行表达式时,它的工作就是运行它们"好像它们已被插入代码中当前停止的位置"这是-[UIViewController viewDidLoad] ...所以__PRETTY_FUNCTION__的正确答案应该是-[UIViewController viewDidLoad]

然而,lldb对表达式的当前帧的仿真并没有让这些令牌报告它们在生成指令的代码中编译表达式时所具有的值你现在已经停在了。所以这些令牌只是得到一些随机值。

让它们正确可能是可能的,但似乎比它的价值更麻烦,因为你已经在该框架中的调试器中停止了。 lldb命令

(lldb) f 0

会告诉你你在哪里更直截了当。

BTW,lldb模仿当前帧的一个技巧是在当前帧的类上创建一个类别,为该类插入一个新方法,在该方法中插入表达式,并调用它传入停止框架的自我。那样lldb会引用ivars&方法按预期工作。 NSLog始终在日志前面加上时间戳和self最具体的类。这就是为什么你在时间戳之后始终看到一个合理的类名。

如果您告诉我们更多关于您实际上要记录的信息,或许我们可以提供更多帮助。