OS X 相当于 OutputDebugString()?

问题描述 投票:0回答:4

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

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

谢谢

杰瑞

c++ macos cross-platform macos-carbon
4个回答
20
投票

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

}

14
投票

首先,Carbon 现在和将来都不会在 64 位版本中提供。如果 Apple 放弃 32 位 Mac OS X(可以肯定地认为迟早会发生),您的应用程序将无法运行。使用可可。

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

  1. NSLog

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

    extern "C" int NSLog(CFStringRef format, ...);

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

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

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

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

旧的 C 标准库备用。

#include <stdio.h>
来获取它们。在 GUI 应用程序中这并不重要,但您应该使用 stderr 来保持整洁:
fprintf(stderr, "Count: %u\n", count);

  1. 系统日志

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

  1. asl_log

Apple System Logger 的一部分,Apple 更通用的系统日志替代品。我的博客上有 一系列关于 ASL 的帖子。


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();

谷歌系统日志了解更多信息。您还必须调整

syslog.conf

 中的一些位以将输出定向到日志或控制台。然后您可以在终端窗口中或使用控制台应用程序查看输出。


1
投票
在 Xcode 中,您可以在“控制台”窗口(运行 -> 控制台)中看到

std::cout

/
std::cerr
 的输出。

还有 Console.app(在 /Applications/Utilities 中),它记录从 GUI 应用程序写入到

std::cerr

 的所有输出。

© www.soinside.com 2019 - 2024. All rights reserved.