我正在使用一些 Objective-C++ 代码从我的主应用程序启动后台进程。后台进程没有 GUI,只运行片刻,必须从主应用程序运行才能发挥作用。这意味着我无法使用 Xcode 轻松附加到后台进程或独立运行它,因此我需要依赖到 stderr 的输出。
在这种情况下,我应该在哪里寻找 stderr 输出?
更多信息,以防我问错问题:我使用的是旧版本的 Xcode (3.2.6),原因与我正在维护的项目的年龄有关。我正在研究异常处理/报告代码,这使得单步执行代码变得困难,因为 GDB 喜欢捕获异常而不是让我的代码来执行。后台进程仅在主应用程序中发生结构化异常时启动。
我的主应用程序上 lsof 命令的结果摘录,可能是相关的:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
<appname> 2788 <username> 0r CHR 3,2 0t0 311 /dev/null
<appname> 2788 <username> 1w CHR 3,2 0t473379 311 /dev/null
<appname> 2788 <username> 2w CHR 3,2 0x6d545f8 311 /dev/null
最佳答案
您可以使用 lsof
命令找出特定文件描述符被重定向到的位置:
lsof -a -p <your pid> -d 0,1,2
启动后台进程时,子进程通常与父进程附加到相同的标准流。默认情况下,对于普通的 Cocoa 应用程序,您应该能够在“所有消息”或“控制台消息”下的 Console.app 中看到该输出。
在 Mountain Lion 之前,您还可以在那里查看 launchd 服务的输出,但我相信此后 launchd 会将 stdout 和 stderr 重定向到/dev/null。
This means I can't easily attach to the background process with XCode or run it stand-alone
如果您可以从 Xcode 运行主应用程序,您应该能够将调试器设置为附加到它启动的子进程。
Xcode 调试器也可以被告知等待特定进程启动并附加到它。
关于c++ - C++ stderr 输出在 OSX 中的哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23067732/