it-swarm.com.ru

Как мне отладить с помощью NSLog ("Внутри симулятора iPhone")?

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

55
Rob Sawyer

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

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

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

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

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

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

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

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

214
cdespinosa

Вот большой кусок кода, который я взял где-то в сети. Он определяет новые функции 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__);
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