web-dev-qa-db-ja.com

NSLog(@ "Inside of the iPhone Simulator")でデバッグするにはどうすればよいですか?

私はプログラミングに慣れており、ログメッセージを表示できるようにしています。 Cocoaアプリケーションをデバッグするときに、NSLog()を使用してメッセージを追跡できるようになったことを知っています。 iPhone Xcode開発環境でコーディングするときにメッセージを「トレース」する最良の方法は何ですか?

55
Rob Sawyer

Xcodeのログメッセージでトレースするはるかに便利な方法があり、それはブレークポイントアクションを使用しています。

PrintfまたはNSLogを追加したいコードの行で、ブレークポイントを設定し、Ctrlキーを押しながらクリックして、「ブレークポイントの編集」を選択します。表示される青いバブルで、右側の[+]ボタンをクリックして、ブレークポイントアクションを開きます。 alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

そこにログテキストを入力します。デバッガーで印刷できる式は、@記号で区切られている場合に使用できます。

Objective-Cをデバッグするには、ポップアップから「デバッガコマンド」を選択し、「po [[object method] method]」と入力して、Objective-Cオブジェクトの説明文字列またはメソッド呼び出しの結果を出力する方が一般に便利です。

ログの後に実行が継続されるように、右上の「続行」チェックボックスをクリックしてください。

NSLogおよびprintfに対するこの利点:

  • 急いでいます。ログメッセージを追加または編集するために、再コンパイルして再起動する必要はありません。これにより、時間を大幅に節約できます。
  • それらを選択的に有効または無効にすることができます。 1つから十分に学習しても、その噴出が干渉している場合は、[有効]ボックスのチェックを外してください。
  • すべての出力はMacで生成され、iPhoneで生成されることはありません。そのため、事後にログをダウンロードして解析する必要はありません。
  • アプリケーションでコンソールが吐き出される可能性が大幅に減少します。

また、Speakボタンもチェックしてください。デバッグログが表示されないフルスクリーンアプリのデバッグに最適です。

214
cdespinosa

以下は、Webのどこかで見つけたすばらしいコードです。新しい関数DLog()およびALog()を定義します。 DLogメッセージは、アプリが-DDEBUGフラグ(DEBUGの定義)でコンパイルされている場合にのみ表示されます。 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__);
9
Elliot

私のプロジェクトでは、 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]);
5
Jane Sales

これをプレフィックスヘッダーに貼り付けます。プロジェクトのすべてのログは確実に消えます。

#ifndef __OPTIMIZE__

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

#else

#    define NSLog(...) {}

#endif
2
Abhishek Bedi

NSLogger を使用できます。これは、メッセージをログに記録するだけでなく、テーブルにより多くのものをもたらします。マクロを使用してリリースビルドのログを無効にし、デバッグビルドではそれらのログをすべてアクティブのままにします。 NSLoggerは強力なログフィルタリングオプションを提供するため、ログボリュームは問題ではありません。

0
fpillet