我试图使用断点而不是NSLog
进行日志记录,但在访问"神奇"的编译器变量(如__FUNCTION__
、__FILE__
等)时遇到了问题。
Debugger Command
和Log 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__;
我不确定,但由于这些都是预处理器宏,我认为你无法在运行时使用它们。