OS X는 outputDeBugString ()에 해당합니까?
-
03-07-2019 - |
문제
기존 Windows MFC 컨트롤을 OS X/Carbon으로 포팅 할 수있는 타당성을 검사하고 있습니다. 내 테스트 베드는 Xcode 3 마법사를 사용하여 생성 된 C ++ 탄소 적용입니다.
DBGVIEW와 동등한 OS X에 추적 정보를 덤프하는 빠른 방법을 찾고 있습니다. Win32에서 outputdebugstring () - OS X의 거래는 무엇입니까? 탄소 앱에서 std :: cout에 작성된 테스트를 볼 수있는 방법이 있습니까?
감사
실내 변기
해결책
실제 동등한 것은 없습니다. Xcode는 후드 아래에서 GDB를 사용하므로 기본적으로이를 다루고 있습니다. 그러나 직접 구현할 수 있습니다. 아래 코드 샘플은 디버거가있을 때만 출력을 표준으로 생성합니다. NDEBUG가 컴파일 시간에 존재하는 경우 사전 처리기 지시문으로 마크로로 래핑하여이를 더욱 보호 할 수 있습니다. 응용 프로그램에서 생성 된 모든 출력은 Xcode의 디버깅 콘솔로 향합니다.
extern "C" {
bool IsDebuggerPresent() {
int mib[4];
struct kinfo_proc info;
size_t size;
info.kp_proc.p_flag = 0;
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
size = sizeof(info);
sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
return ((info.kp_proc.p_flag & P_TRACED) != 0);
}
void OutputDebugString(const char *restrict fmt, ...) {
if( !IsDebuggerPresent() )
return;
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
}
다른 팁
우선, Carbon은 64 비트로 제공되지 않습니다. Apple이 32 비트 Mac OS X를 떨어 뜨린 경우 (빨리 또는 나중에 발생하는 것이 안전합니다) 앱이 실행되지 않습니다. 코코아를 사용하십시오.
즉, 로깅을 수행하는 몇 가지 방법이 있습니다.
NSLOG
이것은 코코아 기능이지만 탄소 앱에서도 사용할 수 있습니다. 기초 프레임 워크에 대한 링크이지만 헤더를 포함하지 마십시오. 직접 선언하십시오.
int NSLog(CFStringRef format, ...);
CFSTR 리터럴을 형식으로 전달합니다.
NSLog(CFSTR("Count: %u"), count);
NSLOG의 장점은 %@ formatter를 사용하여 CF 속성 목록 개체 (문자열, 데이터 객체, 날짜, 숫자, 배열 및 사전)를 인쇄 할 수 있다는 것입니다. 예를 들어:
CFArrayRef array = /*...*/; NSLog(CFSTR("Array: %@"), array);
printf/fprintf
기존 C 표준 라이브러리 대기.
#include <stdio.h>
그들을 얻기 위해. GUI 앱에서는 중요하지 않지만 청결을 위해 STDERR을 사용해야합니다.fprintf(stderr, "Count: %u\n", count);
syslog
f? printf만큼 오래되었지만, 나는 추측하지만 더 강력합니다. 이것은 실제입니다 로깅 시스템, 파일에만 쓰는 것이 아닙니다. 우선 순위와 같은 것을 지정하여 베타 테스터 시스템에서 디버그 로그 메시지를 억제하면서도 자체 시스템에서 읽을 수 있습니다. (최종 릴리스에는 로깅 코드가 전혀 포함되어서는 안됩니다.)
ASL_LOG
Apple System Logger의 일부인 Apple의 Syslog 대체품. 나는 가지고있다 ASL에 관한 일련의 게시물 내 블로그에서.
당신은 조사하고 싶을 수도 있습니다 syslog
UNIX 기반 시스템에서 사실상 진단 방법이므로. 같은 것 :
#include <syslog.h>
/* Do this early on in your program like at the beginning of main() */
openlog("MYPROGRAM", 0, LOG_USER);
/* Use this to log something */
syslog(LOG_DEBUG, "%s %s", "Hello", "World");
/* Do this somewhere before you exit if you being are pedantic */
closelog();
자세한 내용은 Google Syslog. 당신은 또한 약간의 비트를 twiddle해야합니다 syslog.conf
출력을 로그 또는 콘솔로 지시합니다. 그런 다음 터미널 창에서 출력을 볼 수 있거나 콘솔 응용 프로그램을 사용할 수 있습니다.
Xcode에서는 출력을 볼 수 있습니다 std::cout
/std::cerr
"콘솔"창 (run-> 콘솔)에서.
Console.App (IN /Applications /Utilities)도 있습니다. std::cerr
GUI 응용 프로그램에서.