我正在研究将现有Windows MFC控件移植到OS X/Carbon的可行性.我的测试台是使用XCode 3向导生成的C++ Carbon应用程序.
我正在寻找一种快速方法将一些跟踪信息转储到调试器或OS X等效的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); } }
首先,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
得到他们.在GUI应用程序中并不重要,但您应该使用stderr来保持清洁:fprintf(stderr, "Count: %u\n", count);
系统日志
大约和f?printf一样久,我猜,但更强大.这是一个实际的日志记录系统,而不仅仅是写入文件.您可以指定优先级之类的内容,允许您在beta测试人员的系统上抑制调试日志消息,同时仍然可以在您自己的系统上读取它们.(最终版本根本不应包含日志代码.)
asl_log
作为Apple System Logger的一部分,Apple是syslog的更普遍的替代品.我在博客上有一系列关于ASL的帖子.