14

既存の Windows MFC コントロールを OS X/Carbon に移植する可能性を検討しています。私のテスト ベッドは、XCode 3 Wizard を使用して生成された C++ Carbon アプリケーションです。

トレース情報をデバッガーまたは OS X の DbgView に相当するものにダンプする簡単な方法を探しています。Win32 では OutputDebugString() を使用します - OS X ではど​​うですか? Carbon アプリから std::cout に書き込まれたテストを表示する方法はありますか?

ありがとう

ジェリー

4

4 に答える 4

20

本当の同等物はありません。Xcodeは内部でGDBを使用しているので、基本的にそれを扱っています。ただし、自分で実装することはできます。以下のコードサンプルは、デバッガーが存在する場合にのみ標準出力への出力を生成します。コンパイル時にNDEBUGが存在する場合は、プリプロセッサディレクティブでマクロとしてラップし、コンパイル(またはインラインnil関数)することで、これをさらに保護できます。アプリケーションによって生成された出力はすべて、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);
}

}
于 2009-01-06T19:49:12.770 に答える
5

syslogUNIX ベースのシステムでは事実上の診断方法であるため、調べてみるとよいでしょう。何かのようなもの:

#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 を参照してください。syslog.conf出力をログまたはコンソールに送るために、いくつかのビットをいじる必要もあります。その後、ターミナル ウィンドウまたはコンソール アプリケーションを使用して出力を表示できます。

于 2009-01-06T20:22:25.840 に答える
1

Xcodeでは、「コンソール」ウィンドウ (Run->Console)でstd::cout/の出力を確認できます。std::cerr

std::cerrGUI アプリケーションから書き込まれたすべての出力をログに記録する Console.app (/Applications/Utilities 内) もあります。

于 2009-01-06T20:20:33.563 に答える