OS X相当于OutputDebugString()?

J E*_*ans 14 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的测试?

谢谢

杰瑞

Jas*_*oco 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);
}

}
Run Code Online (Sandbox Code Playgroud)

  • 写入stderr而不是stdout要好一些,这样它就不会被缓冲了. (2认同)

Pet*_*sey 13

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

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

  1. 的NSLog

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

    int NSLog(CFStringRef format, ...);
    
    Run Code Online (Sandbox Code Playgroud)

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

    NSLog(CFSTR("Count: %u"), count);
    
    Run Code Online (Sandbox Code Playgroud)

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

    CFArrayRef array = /*...*/;
    NSLog(CFSTR("Array: %@"), array);
    
    Run Code Online (Sandbox Code Playgroud)
  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的更普遍的替代品.我在博客上有一系列关于ASL的帖子.


D.S*_*ley 5

您可能需要研究一下,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();
Run Code Online (Sandbox Code Playgroud)

谷歌系统日志了解更多信息。您还必须调整一些位syslog.conf以将输出定向到日志或控制台。然后,您可以在终端窗口中或使用控制台应用程序查看输出。