Как мне отладить с помощью NSLog («Внутри симулятора iPhone»)? - PullRequest
55 голосов
/ 17 февраля 2009

Я привык программировать и иметь возможность просматривать сообщения журнала. Я знаю, что раньше вы могли использовать NSLog() для отслеживания сообщений при отладке приложений Какао. Как лучше всего «отслеживать» сообщения при кодировании в среде разработки iPhone Xcode?

Ответы [ 6 ]

214 голосов
/ 19 февраля 2009

Существует гораздо более удобный способ отследить сообщения журнала в XCode, и для этого используются действия точки останова.

В строке кода, где у вас возникнет желание добавить printf или NSLog, установите точку останова, затем щелкните ее, удерживая нажатой клавишу Control, и выберите «Редактировать точку останова». В появившемся голубом пузыре нажмите кнопку + справа, чтобы открыть действия точки останова. альтернативный текст http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

Введите там текст вашего журнала. Любое выражение, которое может быть напечатано в отладчике, может использоваться, если оно разделено знаками @.

Для отладки Objective-C, как правило, более полезно выбрать «Команду отладчика» во всплывающем окне и ввести «po [[метод объекта] метод]» для вывода строки описания объекта Objective-C или результата метода. звоните.

Обязательно установите флажок «Продолжить» в правом верхнем углу, чтобы выполнение продолжалось после журнала.

Преимущества этого по сравнению с NSLog и printf:

  • Это на лету. Вам не нужно перекомпилируйте и перезапустите, чтобы добавить или изменить журнал сообщений. Это экономит вам много время.
  • Вы можете выборочно включить и отключить их. Если ты выучишь достаточно от одного, но его выброс вмешиваясь, просто снимите флажок коробка.
  • Весь вывод генерируется на вашем Mac, никогда не на iPhone, так что вы не нужно скачивать и разбирать через логи после свершившегося факта.
  • Шанс доставки консоли извергается в вашем приложении значительно уменьшилась.

Также проверьте кнопку Speak; отлично подходит для отладки полноэкранных приложений, где вы не видите журнал отладки.

9 голосов
/ 12 марта 2010

Вот большой кусок кода, который я взял где-то в сети. Он определяет новые функции DLog () и ALog (). Сообщения DLog появляются только тогда, когда приложение скомпилировано с флагом -DDEBUG (определите DEBUG). Сообщения ALog ВСЕГДА появляются (даже в режиме Release).

// 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__);
5 голосов
/ 18 февраля 2009

В моем проекте у меня есть индивидуальное решение, основанное на 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]);
2 голосов
/ 28 апреля 2011

Вставьте это в заголовок вашего префикса. ВСЕ журналы проекта исчезнут наверняка.

#ifndef __OPTIMIZE__

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

#else

#    define NSLog(...) {}

#endif
0 голосов
/ 01 ноября 2011

Вы можете использовать NSLogger , который приносит гораздо больше информации, чем просто запись ваших сообщений Я использую макросы для отключения журналов в сборках релизов, оставляя каждый из них активным в сборках отладки. Объем журнала не является проблемой, поскольку NSLogger предлагает мощные опции фильтрации журналов.

0 голосов
/ 25 февраля 2009

Я просто использую замену всех функций ....

Я отключаю все свои операторы NSLog, заменяя NSLog (@ "на // *** NSLog (@"

Таким образом, я могу просто найти его (используя поиск во всех файлах проекта) с помощью // *** NSLog (@ "и снова включить их

Ничего особенного, но это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...