C++ OS X相当于OutputDebugString()?

C++ OS X相当于OutputDebugString()?,c++,macos,cross-platform,macos-carbon,C++,Macos,Cross Platform,Macos Carbon,我正在研究将现有的WindowsMFC控件移植到OSX/Carbon的可行性。 我的测试床是使用XCODE 3向导生成的C++应用程序。 我正在寻找一种快速的方法,将一些跟踪信息转储到调试器或OSX的DbgView等效程序中。在Win32上我会使用OutputDebugString()-在OS X上有什么交易?有没有办法从Carbon应用程序查看写入std::cout的测试 谢谢 杰瑞没有真正的对等物。Xcode在引擎盖下使用GDB,所以您基本上是在处理这个问题。但是,您可以自己实现它。下面的代

我正在研究将现有的WindowsMFC控件移植到OSX/Carbon的可行性。 我的测试床是使用XCODE 3向导生成的C++应用程序。 我正在寻找一种快速的方法,将一些跟踪信息转储到调试器或OSX的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);
}

}

在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();
#包括
/*在程序的早期执行此操作,就像在main()的开头一样*/
openlog(“MYPROGRAM”,0,日志用户);
/*用这个来记录一些东西*/
系统日志(日志调试,“%s%s”,“你好”,“世界”);
/*如果你是个学究,在你离开之前的某个地方做这个*/
closelog();

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

首先,Carbon在64位中不可用。如果苹果曾经放弃32位MacOSX(可以肯定,这迟早会发生),你的应用程序将无法运行。使用可可粉

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

  • NSLog

    这是一个Cocoa函数,但你也可以在碳应用程序中使用它。链接到基础框架,但不包括头文件。你自己申报:

    int NSLog(CFStringRef format, ...);
    
    您将以以下格式传递一个CFSTR文本:

    NSLog(CFSTR("Count: %u"), count);
    
    NSLog的优点是,您可以使用%@格式化程序打印CF属性列表对象(字符串、数据对象、日期、数字、数组和字典)。例如:

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

    旧的C标准库备用<代码>#包括以获取它们。这在GUI应用程序中并不重要,但您应该使用stderr来保持整洁:
    fprintf(stderr,“Count:%u\n”,Count)

  • 系统日志

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

  • asl_日志

    作为Apple System Logger的一部分,是Apple更通用的syslog替代品。我在我的博客上写了一篇文章


  • 杰森-我忘了说谢谢了。谢谢,这正是我需要的。我所要做的就是找到正确的。h to#include:)最后还要注意一个警告:最好写到stderr而不是stdout,这样它就不会被缓冲。是不是在OSX 10.10中通过Finder启动应用程序时,写到stderr或stdout不再起作用了?我在Console.app中的“所有消息”下看不到我的应用程序的任何此类输出;即使在QuickTime插件中也能工作。例如