development

NSLog (@ "Inside of the iPhone Simulator")로 어떻게 디버깅합니까?

big-blog 2020. 12. 31. 23:19
반응형

NSLog (@ "Inside of the iPhone Simulator")로 어떻게 디버깅합니까?


나는 프로그래밍하고 로그 메시지를 볼 수 있도록하는 데 익숙합니다. NSLog()Cocoa 애플리케이션을 디버깅 할 때 메시지를 추적하는 데 사용할 수 있었던 것을 알고 있습니다 . iPhone Xcode 개발 환경에서 코딩 할 때 메시지를 "추적"하는 가장 좋은 방법은 무엇입니까?


Xcode에서 로그 메시지를 추적하는 훨씬 더 편리한 방법이 있으며, 이것이 Breakpoint Actions를 사용하는 것입니다.

printf 또는 NSLog를 추가하려는 코드 줄에서 중단 점을 설정 한 다음 control- 클릭하고 "Edit Breakpoint"를 선택합니다. 나타나는 파란색 풍선에서 오른쪽에있는 + 버튼을 클릭하여 중단 점 작업을 엽니 다. alt text http://idisk.mac.com/cdespinosa/Public/Breakpoint%20Actions.png

거기에 로그 텍스트를 입력하십시오. 디버거에서 인쇄 할 수있는 모든 표현식은 @ 기호로 구분할 때 사용할 수 있습니다.

Objective-C를 디버깅하려면 일반적으로 팝업에서 "Debugger Command"를 선택하고 'po [[object method] method]'를 입력하여 Objective-C 개체의 설명 문자열 또는 메서드 호출의 결과를 인쇄하는 것이 더 유용합니다.

로그 이후에 실행이 계속되도록 오른쪽 상단의 "계속"확인란을 클릭하십시오.

NSLog 및 printf에 대한 이점 :

  • 즉석입니다. 로그 메시지를 추가하거나 편집하기 위해 다시 컴파일하고 다시 시작할 필요가 없습니다. 이렇게하면 많은 시간을 절약 할 수 있습니다.
  • 선택적으로 활성화 및 비활성화 할 수 있습니다. 하나에서 충분히 배웠지 만 분출이 방해가되는 경우 사용 상자를 선택 취소하십시오.
  • 모든 출력은 iPhone이 아닌 Mac에서 생성되므로 이후에 로그를 다운로드하고 구문 분석 할 필요가 없습니다.
  • 응용 프로그램에서 콘솔이 분출 될 가능성이 크게 줄어 듭니다.

말하기 버튼도 확인하세요. 디버그 로그를 볼 수없는 전체 화면 앱을 디버깅하는 데 유용합니다.


다음은 웹 어딘가에서 선택한 코드입니다. 새로운 함수 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__);

내 프로젝트에는 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]);

접두사 헤더에 붙여 넣으세요. 프로젝트의 모든 로그는 확실히 사라집니다.

#ifndef __OPTIMIZE__

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

#else

#    define NSLog(...) {}

#endif

메시지를 로깅하는 것보다 테이블에 더 많은 것을 가져 오는 NSLogger사용할 수 있습니다 . 저는 매크로를 사용하여 릴리스 빌드에서 로그를 비활성화하고 디버그 빌드에서는 모든 로그를 활성화합니다. NSLogger는 강력한 로그 필터링 옵션을 제공하므로 로그 볼륨은 문제가되지 않습니다.


나는 단순히 모든 기능을 대체합니다 ....

NSLog (@ "를 // *** NSLog (@"로 대체하여 모든 NSLog 문을 비활성화합니다.

That way I can simply find it (using find in all project files) with //***NSLog(@" and re-enable them

Nothing fancy but it works :)

ReferenceURL : https://stackoverflow.com/questions/558568/how-do-i-debug-with-nsloginside-of-the-iphone-simulator

반응형