質問

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

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

ありがとう

ジェリー

役に立ちましたか?

解決

実際に同等のものはありません。 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);
}

}

他のヒント

まず、Carbonは64ビットでは使用できません。 Appleが32ビットMac OS Xをドロップした場合(遅かれ早かれ起こると想定しても安全です)、アプリは実行されません。 Cocoaを使用します。

とはいえ、ロギングを行う方法はいくつかあります:

  1. NSLog

    これはCocoa関数ですが、Carbonアプリでも使用できます。 Foundationフレームワークにリンクしますが、ヘッダーは含めません。自分で宣言:

    int NSLog(CFStringRef format, ...);
    

    CFSTRリテラルをフォーマットとして渡します:

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

    NSLogの利点は、%@フォーマッタを使用して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のsyslogのより一般的な代替品であるApple System Loggerの一部。 ASLに関する一連の投稿私のブログで。

UNIXベースのシステムでは事実上の診断方法であるため、syslogを調べることをお勧めします。次のようなもの:

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

Xcodeでは、std::cout / std::cerrの出力を<!> quot; console <!> quot;で確認できます。ウィンドウ(Run-<!> gt; Console)。

Console.app(/ Applications / Utilities内)もあり、GUIアプリケーションから<=>に書き込まれたすべての出力を記録します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top