如何使用NSLog调试(@“iPhone模拟器内部”)?

时间:2009-02-17 20:26:38

标签: iphone objective-c cocoa xcode nslog

我习惯于编程并且可以查看日志消息。我知道您曾经能够在调试Cocoa应用程序时使用NSLog()来跟踪消息。在iPhone Xcode开发环境中编码时,“跟踪”消息的最佳方法是什么?

6 个答案:

答案 0 :(得分:214)

在Xcode中跟踪日志消息有一种更方便的方法,那就是使用断点操作。

在您想要添加printf或NSLog的代码行上,设置断点,然后按住Control键并单击它并选择“编辑断点”。在出现的蓝色气泡中,单击右侧的+按钮以打开断点操作:  alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

在那里输入您的日志文本。当@符号分隔时,可以使用可以在调试器中打印的任何表达式。

对于调试Objective-C,从弹出窗口中选择“Debugger Command”并输入'po [[object method] method]'来打印Objective-C对象的描述字符串或方法的结果通常更有用。调用

确保单击右上角的“继续”复选框,以便在日志后继续执行。

这优于NSLog和printf:

  • 它在飞行中。你不必 重新编译并重新启动以添加或编辑 记录消息。这可以为您节省很多 时间。
  • 您可以有选择地启用和 禁用它们。如果你学到的话 从一个,但它的喷射是 干扰,只需取消选中它的Enabled 框。
  • 所有输出都是在您的身上生成的 Mac,永远不会在iPhone上,所以你 不必下载和解析 事后通过日志。
  • 发货控制台喷出的机会 在你的应用程序是显着的 降低。

还要查看Speak按钮;它非常适合调试无法看到调试日志的全屏应用程序。

答案 1 :(得分:9)

这是我在网上某处找到的大量代码。它定义了新函数DLog()和ALog()。仅当使用-DDEBUG标志(定义DEBUG)编译应用程序时,才会显示DLog消息。始终显示ALog消息(即使在释放模式下)。

// DLog is almost a drop-in replacement for NSLog
// DLog();
// DLog(@"here");
// DLog(@"value: %d", x);
// Unfortunately this doesn't work DLog(aStringVariable); you have to do this instead DLog(@"%@", aStringVariable);
#ifdef DEBUG
#       define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#       define DLog(...)
#endif

// ALog always displays output regardless of the DEBUG setting
#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

答案 2 :(得分:5)

在我的项目中,我有一个基于DebugOutput.m的自定义解决方案。这会添加文件&调试输出的行号,使得更容易识别输出文本的来源,同时仍然保持简洁。

我使用调试掩码扩充了标准解决方案,以便我可以在我的应用中为特定的功能区域打开和关闭调试。在Debug.h中,我有

typedef enum {
kDebugMaskAp- = 1,
kDebugMaskXMLParser = 1 << 1,
kDebugMaskNetwork = 1 << 2,
kDebugMaskAnalytics = 1 << 3,
kDebugMaskCache = 1 << 4,
} debugBitMask;

#define debugForComponent(mask,format,...) if( currentDebugMask() & mask) [[DebugOutput sharedDebug]  output:__FILE__ lineNumber:__LINE__ input:(format), ##__VA_ARGS__]

在Debug.m中

-(void)output:(char*)fileName lineNumber:(int)lineNumber input:(NSString*)input, ...
{
  va_list argList;
  NSString *filePath, *formatStr;

  // Build the path string
  filePath = [[NSString alloc] initWithBytes:fileName length:strlen(fileName) encoding:NSUTF8StringEncoding];

  // Process arguments, resulting in a format string
  va_start(argList, input);
  formatStr = [[NSString alloc] initWithFormat:input arguments:argList];
  va_end(argList);

  // Call NSLog, prepending the filename and line number
  NSLog(@"File:%s Line:%d %@",[((DEBUG_SHOW_FULLPATH) ? filePath : [filePath lastPathComponent]) UTF8String], lineNumber, formatStr);

  [filePath release];
  [formatStr release];
}

在应用程序中,调用看起来像这样:

debugForComponent(kDebugMaskApp,@"Request failed - error %@", [error localizedDescription]);

答案 3 :(得分:2)

将其粘贴到前缀标题中。来自项目的所有日志肯定会消失。

#ifndef __OPTIMIZE__

#    define NSLog(...) NSLog(__VA_ARGS__)

#else

#    define NSLog(...) {}

#endif

答案 4 :(得分:0)

您可以使用NSLogger,这样可以为表格带来更多信息,而不仅仅是记录您的消息。我使用宏来禁用发布版本中的日志,同时让它们中的每一个都在调试版本中保持活动状态。日志卷不是问题,因为NSLogger提供了强大的日志过滤选项。

答案 5 :(得分:-2)

我只是使用替换所有功能....

我通过替换NSLog(@“和// *** NSLog(@”

)来禁用所有NSLog语句

这样我就可以在// *** NSLog(@“并重新启用它们)

中找到它(在所有项目文件中使用find)

没有什么花哨但它有效:)