我有一个视频处理守护进程 (python),它运行多个进程,其中一些使用 GStreamer 将原始视频帧获取到我的自定义元素 (C)。一些进程“冻结”(进程is_alive() = True
,但 Gstreamer 管道不做任何事情,也不调用任何 python 回调) - 通常在 2-10 天后,并且仅在生产中。我无法在我的计算机上复制它。
现在我有来自 python 日志(主程序)和 glib 日志(C 插件)的日志文件,但没有任何帮助,即使我在各处添加了更多的日志消息。所以我希望 GStreamer 的消息中会有一些线索。
我在专用于视频处理的进程中运行 glib“主循环”,然后将带有结果的消息发送multiprocessing.Queue
到另一个进程,以供进一步处理。这些 gst/video-processes 对 python 有点陌生——有很多来自 gstreamer 和其他 gstreamer 怪异的回调。这就是为什么我将它们隔离在不同的进程中。
我在回调中有一些 python 日志记录,在 C 插件中有很多 glib 日志记录,但这显然还不够。python 程序和 C 元素之间可能会失败。所以我真的需要看看 GStreamer 的内部到底发生了什么。
不幸的是,在我看来,除了拦截stderr
.
我尝试在没有守护进程的情况下运行该程序,设置GST_DEBUG
并存储stderr
到一个 gzip 压缩文件中,但这并没有太大帮助,因为我将所有 GStreamer 消息混合在一个巨大的文件中。
总结一下:
- 我有一个守护进程(因此没有标准错误,没有标准输出)
- 在守护进程中,我有很多子进程
- 其中一些(实际上是 14 个)运行 GStreamer 管道
- 我有一些神秘的失败
- 我非常需要 GStreamer 调试输出
- 但我需要将每个进程的 GStreamer 消息写入不同的文件,这样我就不会迷失在其中
- 我不知道该怎么做。
正如评论中所建议的,我可以使用GST_DEBUG_FILE
env.variable,但这适用于 GStreamer 0.10.31。我有 0.10.30 所以我不能使用它。
或者我可以编写自定义日志处理程序,但由于它必须用 python 编写,并且 python 绑定无法访问“gst_debug_log_default”,所以这也不起作用(也许我错了)。