OS XはOutputDebugString()と同等ですか?
-
03-07-2019 - |
質問
既存の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を使用します。
とはいえ、ロギングを行う方法はいくつかあります:
-
NSLog
これはCocoa関数ですが、Carbonアプリでも使用できます。 Foundationフレームワークにリンクしますが、ヘッダーは含めません。自分で宣言:
int NSLog(CFStringRef format, ...);
CFSTRリテラルをフォーマットとして渡します:
NSLog(CFSTR("Count: %u"), count);
NSLogの利点は、%@フォーマッタを使用して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の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アプリケーションから<=>に書き込まれたすべての出力を記録します。