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
'development' 카테고리의 다른 글
데이터 테이블 날짜 정렬 dd / mm / yyyy 문제 (0) | 2020.12.31 |
---|---|
파이썬에서 문자열을 문자 목록으로 나누기 (0) | 2020.12.31 |
일반 목록의 표준 편차? (0) | 2020.12.31 |
MB로 파일 크기를 얻는 방법? (0) | 2020.12.31 |
jQuery UI 정렬 가능한 스크롤 도우미 요소 오프셋 Firefox 문제 (0) | 2020.12.31 |