我正在研究將現有Windows MFC控件移植到OS X/Carbon的可行性。 我的測試牀是使用XCode 3嚮導生成的C++ Carbon應用程序。等同於OutputDebugString()的OS X?
我正在尋找一種快速的方式將一些跟蹤信息轉儲到調試器或DbgView的OS X等價物。在Win32上,我會使用OutputDebugString() - 在OS X上有什麼優勢?有沒有辦法從Carbon應用程序查看寫入std :: cout的測試?
感謝
傑裏
我正在研究將現有Windows MFC控件移植到OS X/Carbon的可行性。 我的測試牀是使用XCode 3嚮導生成的C++ Carbon應用程序。等同於OutputDebugString()的OS X?
我正在尋找一種快速的方式將一些跟蹤信息轉儲到調試器或DbgView的OS X等價物。在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);
}
}
在Xcode中可以看到,在 「控制檯」 窗口(運行 - >控制檯)的std::cout
/std::cerr
的輸出。
還有Console.app(在/ Applications/Utilities中),它記錄了從GUI應用程序寫入std::cerr
的所有輸出。
您可能想要查看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獲取更多信息。您還必須在syslog.conf
中旋轉一些位以將輸出指向日誌或控制檯。然後,您可以在終端窗口中或使用控制檯應用程序查看輸出。
首先,碳不是也不會在64位上可用。如果蘋果公司放棄了32位的Mac OS X(它可以安全地假設會遲早發生),那麼你的應用將無法運行。使用可可。
這就是說,有幾個方法可以做到記錄:
的NSLog
這是可可的功能,但你可以在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應用程序,但你應該使用標準錯誤清潔度:fprintf(stderr, "Count: %u\n", count);
系統日誌
關於老爲f printf的,我猜,但功能更強大?這是一個實際的日誌系統,不只是寫入文件。您可以指定諸如優先級之類的內容,從而允許您在Beta版測試人員的系統上抑制調試日誌消息,同時仍能夠在自己的系統上讀取它們。 (最終版本不應包含日誌代碼在所有。)
asl_log
部分蘋果系統登錄器,蘋果的系統日誌更一般的更換。我的博客上有a series of posts about ASL。
賈森 - 我忘了說這個感謝。謝謝,這正是我所需要的。我所要做的只是找到正確的.h來#include :) – 2009-01-16 19:24:15
同樣重要的是要注意最後的警告:http://developer.apple.com/library/mac/#qa/qa1361/_index.html – 2011-10-04 04:43:33