理想情况下,我想设置一个选择器以查看每次在应用程序中调用NSLog的时间,并获取该NSLog的输出。我正在使用的SDK可能会调用NSLog,我希望能够从我的应用程序中查看这些日志的输出。有可能吗?
答案 0 :(得分:0)
您想要的是一个符号断点。
导航到Xcode中的Breakpoints选项卡,然后使用左下角的+
按钮添加一个。
添加断点后,它应该自动出现一个窗口,该窗口允许您输入希望其暂停执行的条件。您可以使用NSLog
作为符号。
关于调用您自己的自定义函数,您可以尝试通过在该断点中添加一个动作来做到这一点,并通过传入调试器可用的参数来利用调试器的能力来调用自己的代码,例如$arg1
。
答案 1 :(得分:0)
所以我认为不可能将NSLog的每个实例简单地替换为其他东西...但是您可以执行以下操作:
#define NSLog MyLog
void MyLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
void MyLog(NSString *format, ...)
{
va_list list;
va_start(list,format);
NSLogv(format,list);
va_end(list);
va_start(list,format);
vfprintf(stderr,[format UTF8String], list);
va_end(list);
}
int main(int argc, const char * argv[]) {
NSLog(@"hello %s\n","world");
return 0;
}
我的示例使用2个va_list
来登录NSLogv
和vfprintf
这样的NSLog来登录到打开的FILE *流(在这种情况下为stderr)...您也可以可能更简单地设置NSString的格式(因为vfprintf无法打印NS对象)...
我尝试了一下尝试用dlsym重新分配NSLog,这将是整个进程,而不是仅仅在宏扩展时...我无法使其正常工作,但我不是动态链接专家