iOS Objective-C XCode:记录断点和"magic"变量



我试图使用断点而不是NSLog进行日志记录,但在访问"神奇"的编译器变量(如__FUNCTION____FILE__等)时遇到了问题。

Debugger CommandLog Message断点似乎都没有像NSLog那样评估变量。

NSLog(@"%s", __FILE__)导致/Users/nbirkholz/Documents/project_name/folder_name/file_name.m 的正确调试输出

当我设置po __FILE__Debugger Command断点时,我收到"Parse" { 'P' 'a' 'r' 's' 'e' <nil>} 的调试输出

当我使用p __FILE__时,我收到(const char [6]) $1 = "Parse" 的调试输出

p/po__func__/__PRETTY_FUNCTION__/__FUNCTION__/__LINE__也得到了类似的结果

po [NSString stringWithFormat:@"file is: %s", __FILE__]导致error: too many arguments to method call, expected 1, have 2

po (void)NSLog(@"the file is: %s", __FILE__)返回<timestamp> <module> the file is: Parse

CCD_ 23/expression(void)NSLog(@"the file is: %s", __FILE__)给出了相同的结果。

类似地,添加一个Log Message断点要么根本无法评估表达式,要么会产生类似的结果,我似乎找不到一个能在@ @ 中工作的表达式语法

例如,the file is @__FILE__@Log Message产生the file is "Parse"

有没有一种方法可以在不直接向代码中添加NSLog()的情况下实现这一点,并使其正确评估变量?

这些"魔术变量"实际上是宏,其值是在编译过程中引用它们时派生的。它们在调试时的值与在编译时的值不同。事实上,在调试时,您最有可能获得编译到调试器中的变量值。也就是说,不是MySpecialProgram中该代码的文件名,而是在调试器(可能是命令解析器)中执行的代码的文件名称。

要么将日志记录放入代码中,如:

NSLog(@"this is %s line %d function %s", __FILE__, __LINE__, __FUNCTION__);

或者将vars分配给您可以访问的内容:

char[] foo = __FILE__;

我不确定,但由于这些都是预处理器宏,我认为你无法在运行时使用它们。

最新更新