문제

기존 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를 떨어 뜨린 경우 (빨리 또는 나중에 발생하는 것이 안전합니다) 앱이 실행되지 않습니다. 코코아를 사용하십시오.

즉, 로깅을 수행하는 몇 가지 방법이 있습니다.

  1. NSLOG

    이것은 코코아 기능이지만 탄소 앱에서도 사용할 수 있습니다. 기초 프레임 워크에 대한 링크이지만 헤더를 포함하지 마십시오. 직접 선언하십시오.

    int NSLog(CFStringRef format, ...);
    

    CFSTR 리터럴을 형식으로 전달합니다.

    NSLog(CFSTR("Count: %u"), count);
    

    NSLOG의 장점은 %@ formatter를 사용하여 CF 속성 목록 개체 (문자열, 데이터 객체, 날짜, 숫자, 배열 및 사전)를 인쇄 할 수 있다는 것입니다. 예를 들어:

    CFArrayRef array = /*...*/;
    NSLog(CFSTR("Array: %@"), array);
    
  2. printf/fprintf

    기존 C 표준 라이브러리 대기. #include <stdio.h> 그들을 얻기 위해. GUI 앱에서는 중요하지 않지만 청결을 위해 STDERR을 사용해야합니다. fprintf(stderr, "Count: %u\n", count);

  3. syslog

    f? printf만큼 오래되었지만, 나는 추측하지만 더 강력합니다. 이것은 실제입니다 로깅 시스템, 파일에만 쓰는 것이 아닙니다. 우선 순위와 같은 것을 지정하여 베타 테스터 시스템에서 디버그 로그 메시지를 억제하면서도 자체 시스템에서 읽을 수 있습니다. (최종 릴리스에는 로깅 코드가 전혀 포함되어서는 안됩니다.)

  4. 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 응용 프로그램에서.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top