我正在研究将现有Windows MFC控件移植到OS X / Carbon的可行性。 我的测试平台是使用XCode 3向导生成的C ++ Carbon应用程序。
我正在寻找一种快速方法将一些跟踪信息转储到调试器或OS X等效的DbgView。在Win32上我会使用OutputDebugString() - OS X上的交易是什么?有没有办法从Carbon应用程序查看写入std :: cout的测试?
由于
杰里
答案 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。
也就是说,有几种方法可以进行日志记录:
的NSLog
这是一个Cocoa功能,但你也可以在Carbon应用程序中使用它。链接基础框架,但不包括标题。自己声明:
int NSLog(CFStringRef format, ...);
您将传递CFSTR文字作为格式:
NSLog(CFSTR("Count: %u"), count);
NSLog的优点是您可以使用%@ formatter打印CF属性列表对象(字符串,数据对象,日期,数字,数组和字典)。例如:
CFArrayRef array = /*...*/;
NSLog(CFSTR("Array: %@"), array);
的printf / fprintf中
旧的C标准库备用。获得他们#include <stdio.h>
。在GUI应用程序中并不重要,但您应该使用stderr来保持清洁:fprintf(stderr, "Count: %u\n", count);
系统日志
关于f?printf,我猜,但更强大。这是一个实际的日志记录系统,而不仅仅是写入文件。您可以指定优先级之类的内容,允许您在beta测试人员的系统上抑制调试日志消息,同时仍然可以在您自己的系统上读取它们。 (最终版本根本不应包含日志记录代码。)
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
的所有输出。