2009-01-06 126 views
13

我正在研究將現有Windows MFC控件移植到OS X/Carbon的可行性。 我的測試牀是使用XCode 3嚮導生成的C++ Carbon應用程序。等同於OutputDebugString()的OS X?

我正在尋找一種快速的方式將一些跟蹤信息轉儲到調試器或DbgView的OS X等價物。在Win32上,我會使用OutputDebugString() - 在OS X上有什麼優勢?有沒有辦法從Carbon應用程序查看寫入std :: cout的測試?

感謝

傑裏

回答

18

有沒有真正的等價物。 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); 
} 

} 
+0

賈森 - 我忘了說這個感謝。謝謝,這正是我所需要的。我所要做的只是找到正確的.h來#include :) – 2009-01-16 19:24:15

+0

同樣重要的是要注意最後的警告:http://developer.apple.com/library/mac/#qa/qa1361/_index.html – 2011-10-04 04:43:33

1

在Xcode中可以看到,在 「控制檯」 窗口(運行 - >控制檯)的std::cout/std::cerr的輸出。

還有Console.app(在/ Applications/Utilities中),它記錄了從GUI應用程序寫入std::cerr的所有輸出。

4

您可能想要查看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中旋轉一些位以將輸出指向日誌或控制檯。然後,您可以在終端窗口中或使用控制檯應用程序查看輸出。

13

首先,碳不是也不會在64位上可用。如果蘋果公司放棄了32位的Mac OS X(它可以安全地假設會遲早發生),那麼你的應用將無法運行。使用可可。

這就是說,有幾個方法可以做到記錄:

  1. 的NSLog

    這是可可的功能,但你可以在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應用程序,但你應該使用標準錯誤清潔度:fprintf(stderr, "Count: %u\n", count);

  3. 系統日誌

    關於老爲f printf的,我猜,但功能更強大?這是一個實際的日誌系統,不只是寫入文件。您可以指定諸如優先級之類的內容,從而允許您在Beta版測試人員的系統上抑制調試日誌消息,同時仍能夠在自己的系統上讀取它們。 (最終版本不應包含日誌代碼在所有。)

  4. asl_log

    部分蘋果系統登錄器,蘋果的系統日誌更一般的更換。我的博客上有a series of posts about ASL