首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OS X相当于OutputDebugString()?

OS X相当于OutputDebugString()?
EN

Stack Overflow用户
提问于 2009-01-06 19:14:12
回答 4查看 8.7K关注 0票数 14

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

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

谢谢

曾傑瑞

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-06 19:49:13

没有真正的等价物。Xcode在幕后使用GDB,所以基本上就是在处理这个问题。但是,您可以自己实现它。只有当调试器存在时,下面的代码示例才会向标准输出生成输出。如果NDEBUG在编译时存在,您可以通过将其包装在预处理器指令中作为宏,并将其编译出来(或编译为内联nil函数)来进一步保护它。应用程序产生的任何输出都将被定向到Xcode中的调试控制台。

代码语言:javascript
复制
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);
}

}
票数 20
EN

Stack Overflow用户

发布于 2009-01-07 04:36:42

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

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

  1. NSLog

这是一个Cocoa函数,但您也可以在Carbon应用程序中使用它。指向Foundation框架的链接,但不要包含标头。自己声明它:

int NSLog(CFStringRef格式,...);

您将传递一个CFSTR文本作为格式:

NSLog(CFSTR(“计数:%u"),计数);

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

数组= /*...*/;CFArrayRef (CFSTR(“数组:%@"),NSLog

旧的C标准库是备用的。#include <stdio.h>来获取它们。这在图形用户界面应用程序中并不重要,但您应该使用stderr来保持整洁:fprintf(stderr, "Count: %u\n", count);

  • syslog

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

  • asl_log

Apple System Logger的一部分,Apple对syslog的更通用的替代。我的博客上有a series of posts about ASL

票数 13
EN

Stack Overflow用户

发布于 2009-01-06 20:22:26

您可能希望研究一下syslog,因为它是基于UNIX的系统上的实际诊断方法。类似于:

代码语言:javascript
复制
#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中的一些位,以将输出定向到日志或控制台。然后,您可以在终端窗口中或使用控制台应用程序查看输出。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/417745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档