C++ OS X相当于OutputDebugString()?
我正在研究将现有的WindowsMFC控件移植到OSX/Carbon的可行性。 我的测试床是使用XCODE 3向导生成的C++应用程序。 我正在寻找一种快速的方法,将一些跟踪信息转储到调试器或OSX的DbgView等效程序中。在Win32上我会使用OutputDebugString()-在OS X上有什么交易?有没有办法从Carbon应用程序查看写入std::cout的测试 谢谢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,所以您基本上是在处理这个问题。但是,您可以自己实现它。下面的代
杰瑞没有真正的对等物。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(可以肯定,这迟早会发生),你的应用程序将无法运行。使用可可粉
也就是说,有几种方法可以进行日志记录:
int NSLog(CFStringRef format, ...);
您将以以下格式传递一个CFSTR文本:
NSLog(CFSTR("Count: %u"), count);
NSLog的优点是,您可以使用%@格式化程序打印CF属性列表对象(字符串、数据对象、日期、数字、数组和字典)。例如:
CFArrayRef array = /*...*/;
NSLog(CFSTR("Array: %@"), array);
fprintf(stderr,“Count:%u\n”,Count)代码>
杰森-我忘了说谢谢了。谢谢,这正是我需要的。我所要做的就是找到正确的。h to#include:)最后还要注意一个警告:最好写到stderr而不是stdout,这样它就不会被缓冲。是不是在OSX 10.10中通过Finder启动应用程序时,写到stderr或stdout不再起作用了?我在Console.app中的“所有消息”下看不到我的应用程序的任何此类输出;即使在QuickTime插件中也能工作。例如