【问题标题】:Where does C++ stderr output go in OSX?C++ stderr 输出在 OSX 中的位置在哪里?
【发布时间】:2014-05-28 20:44:01
【问题描述】:

我正在使用一些从我的主应用程序启动后台进程的 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

【问题讨论】:

  • 您是否查看过控制台(在“/Application/Utilities/”中找到的应用程序?
  • @Michael 是的,控制台是我看过的地方之一。我不确定我应该在控制台的哪个位置看到 stderr 输出,因为有很多不同的日志/过滤器/文件/等。我什至不知道是否有任何内容成功写入 stderr,因为我不知道应该将其写入何处。
  • @Ben:后台进程是怎么启动的?
  • @MartinR 后台进程由我正在使用的框架中的现有代码启动。本质上,该进程被配置为在它收到一条 mach 消息时运行,然后发送一条消息来启动它。
  • @Ben:如果守护进程是由一些自定义代码启动的,那么它可能是 stderr 被重定向到 /dev/null (你没有机会阅读它)。

标签: c++ xcode macos objective-c++ stderr


【解决方案1】:

您可以使用lsof 命令找出特定文件描述符被重定向到的位置:

lsof -a -p <your pid> -d 0,1,2

当启动后台进程时,子进程通常与父进程附加到相同的标准流。默认情况下,对于普通的 Cocoa 应用程序,您应该能够在 Console.app 中的“所有消息”或“控制台消息”下看到该输出。

在 Mountain Lion 之前,您还可以在那里查看 launchd 服务的输出,但我相信从那时起,launchd 会将 stdout 和 stderr 重定向到 /dev/null。


这意味着我无法使用 XCode 轻松附加到后台进程或单独运行它

如果您可以从 Xcode 运行主应用程序,您应该能够将调试器设置为附加到它启动的子进程。

还可以告诉 Xcode 调试器等待特定进程启动并附加到它。

【讨论】:

  • 我很想在调试器中运行所有的东西,但是它太急于尝试自己处理异常。 GDB 不会让我过去手动触发的异常,因此我无法单步执行我正在尝试测试的代码。
  • @Ben 您应该能够配置 gdb 以允许正常进行异常处理。 -- 是的,lsof 输出表明 stderr 已被重定向到 /dev/null,这意味着它被丢弃而不是发送到任何地方。
  • 在意识到无法完成之前,我一直在努力将 lsof 的输出放入格式良好的注释中......所以我将它添加到我的问题中。我相信您所说的要点是,如果主应用程序将 stderr 定向到 /dev/null,则子应用程序也会这样做。我将尝试弄清楚重定向是如何设置的。
  • @Ben 是的。确保父进程将其输出发送到有用的地方,或者您可以转到启动子进程的位置并将其 stderr 重定向到有用的地方。如果您不关心如何从程序中获取输出,那么另一种选择是使用 syslog API,而不是打印到 stderr。
  • 对于任何试图从终端运行应用程序的人来说,运行 "open " 会将 stdout/stderr 定向到 /dev/null,因为该进程已与终端分离,而从包中运行可执行文件本身使进程在终端内运行(因此终端显示写入 stderr/stdout 的文本)。
猜你喜欢
  • 2015-03-20
  • 2016-02-24
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 2018-04-29
  • 2010-09-13
相关资源
最近更新 更多