OS X相当于OutputDebugString()?

时间:2009-01-06 19:14:12

标签: c++ macos cross-platform macos-carbon

我正在研究将现有Windows MFC控件移植到OS X / Carbon的可行性。 我的测试平台是使用XCode 3向导生成的C ++ Carbon应用程序。

我正在寻找一种快速方法将一些跟踪信息转储到调试器或OS X等效的DbgView。在Win32上我会使用OutputDebugString() - OS X上的交易是什么?有没有办法从Carbon应用程序查看写入std :: cout的测试?

由于

杰里

4 个答案:

答案 0 :(得分:19)

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

}

答案 1 :(得分:13)

首先,Carbon不会也不会以64位的形式提供。如果Apple掉线32位Mac OS X(可以安全地假设迟早会发生),你的应用程序将无法运行。使用Cocoa。

也就是说,有几种方法可以进行日志记录:

  1. 的NSLog

    这是一个Cocoa功能,但你也可以在Carbon应用程序中使用它。链接基础框架,但不包括标题。自己声明:

    int NSLog(CFStringRef format, ...);
    

    您将传递CFSTR文字作为格式:

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

    NSLog的优点是您可以使用%@ formatter打印CF属性列表对象(字符串,数据对象,日期,数字,数组和字典)。例如:

    CFArrayRef array = /*...*/;
    NSLog(CFSTR("Array: %@"), array);
    
  2. 的printf / fprintf中

    旧的C标准库备用。获得他们#include <stdio.h>。在GUI应用程序中并不重要,但您应该使用stderr来保持清洁:fprintf(stderr, "Count: %u\n", count);

  3. 系统日志

    关于f?printf,我猜,但更强大。这是一个实际的日志记录系统,而不仅仅是写入文件。您可以指定优先级之类的内容,允许您在beta测试人员的系统上抑制调试日志消息,同时仍然可以在您自己的系统上读取它们。 (最终版本根本不应包含日志记录代码。)

  4. asl_log

    Apple System Logger的一部分,Apple是syslog的更普遍的替代品。我的博客上有a series of posts about ASL

答案 2 :(得分: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.conf中旋转一些位以将输出定向到日志或控制台。然后,您可以在终端窗口中查看输出或使用控制台应用程序。

答案 3 :(得分:1)

在Xcode中,您可以在“控制台”窗口(运行 - >控制台)中看到std::cout / std::cerr的输出。

还有Console.app(在/ Applications / Utilities中),它记录从GUI应用程序写入std::cerr的所有输出。