GStreamer Basic tutorial 11 Debugging tools

"GStreamer 基本教程 11: Debugging 工具"

Posted by Stephen on March 23, 2022

前言

本文是GStreamer学习笔记,也可以看成是对原文的意译。

这些教程描述了理解其余教程所需的GStreamer主题。

GStreamer教程:

基础教程 : GStreamer 介绍

基础教程 1: Hello world!

基础教程 2: GStreamer 概念

基础教程 3: 动态管道

基础教程 4: 时间管理

基础教程 5: GUI工具包集成

基础教程 6: 媒体格式和pad功能

基础教程 7: 多线程和Pad可用性

基础教程 8: 管道短路操作

基础教程 9: 媒体信息收集

基础教程 10: GStreamer工具

基础教程 11: 调试工具

基础教程 12: 流媒体

基础教程 13: 播放速度

基础教程 14: 有用的元素

基础教程 16: 特定平台元素

环境

系统环境

Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.4 LTS
Release:	18.04
Codename:	bionic
Linux version :       5.3.0-46-generic ( buildd@lcy01-amd64-013 ) 
Gcc version:         7.5.0  ( Ubuntu 7.5.0-3ubuntu1~18.04 )

软件信息

version : 	
     GStreamer-1.0

正文

1. 目标

有时事情不会按预期进行,从总线检索到的错误消息(如果有的话)只是没有提供足够的信息。幸运的是,GStreamer 附带了大量的调试信息,这些信息通常会提示问题可能是什么。本教程显示:

  • 如何从 GStreamer 获取更多调试信息。
  • 如何将您自己的调试信息打印到 GStreamer 日志中。
  • 如何获取管道图

2. 打印调试信息

2.1 调试日志

GStreamer 及其插件充满了调试跟踪,即在代码中将一条特别有趣的信息打印到控制台的位置,以及时间戳、进程、类别、源代码文件、函数和元素信息。

调试输出由GST_DEBUG环境变量控制。这是一个例子GST_DEBUG=2

  0:00:00.868050000  1592   09F62420 WARN                 filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"

如您所见,这是相当多的信息。事实上,GStreamer 调试日志非常冗长,当完全启用它时,它会导致应用程序无响应(由于控制台滚动)或填满数兆字节的文本文件(当重定向到文件时)。因此,日志是分类的,您很少需要一次启用所有类别。

第一类是调试级别,它是一个指定所需输出量的数字:

  | #   | Name    | Description                                                     |
  | --- | ------- | --------------------------------------------------------------- |
  | 0   | none    | No debug information is output.                                 |
  | 1   | ERROR   | Logs all fatal errors. These are errors that do not allow the   |
  |     |         | core or elements to perform the requested action. The           |
  |     |         | application can still recover if programmed to handle the       |
  |     |         | conditions that triggered the error.                            |
  | 2   | WARNING | Logs all warnings. Typically these are non-fatal, but           |
  |     |         | user-visible problems are expected to happen.                   |
  | 3   | FIXME   | Logs all "fixme" messages. Those typically that a codepath that |
  |     |         | is known to be incomplete has been triggered. It may work in    |
  |     |         | most cases, but may cause problems in specific instances.       |
  | 4   | INFO    | Logs all informational messages. These are typically used for   |
  |     |         | events in the system that only happen once, or are important    |
  |     |         | and rare enough to be logged at this level.                     |
  | 5   | DEBUG   | Logs all debug messages. These are general debug messages for   |
  |     |         | events that happen only a limited number of times during an     |
  |     |         | object's lifetime; these include setup, teardown, change of     |
  |     |         | parameters, etc.                                                |
  | 6   | LOG     | Logs all log messages. These are messages for events that       |
  |     |         | happen repeatedly during an object's lifetime; these include    |
  |     |         | streaming and steady-state conditions. This is used for log     |
  |     |         | messages that happen on every buffer in an element for example. |
  | 7   | TRACE   | Logs all trace messages. Those are message that happen very     |
  |     |         | very often. This is for example is each time the reference      |
  |     |         | count of a GstMiniObject, such as a GstBuffer or GstEvent, is   |
  |     |         | modified.                                                       |
  | 9   | MEMDUMP | Logs all memory dump messages. This is the heaviest logging and |
  |     |         | may include dumping the content of blocks of memory.            |
  +------------------------------------------------------------------------------+

要启用调试输出,请将GST_DEBUG环境变量设置为所需的调试级别。也将显示低于该级别的所有级别(即,如果您设置GST_DEBUG=2,您将同时获得ERRORWARNING消息)。

此外,每个插件或 GStreamer 的一部分都定义了自己的类别,因此您可以为每个单独的类别指定调试级别。例如GST_DEBUG=2,audiotestsrc:6,, 将对元素使用调试级别 6,audiotestsrc对所有其他元素使用 2。

因此,GST_DEBUG环境变量是一个以逗号分隔的 category : level对列表,开头有一个可选级别,表示所有类别的默认调试级别。

'*'通配符也可用。例如 GST_DEBUG=2,audio*:6,将对所有以单词开头的类别使用 Debug Level 6 audioGST_DEBUG=*:2相当于 GST_DEBUG=2

用于gst-launch-1.0 --gst-debug-help获取所有已注册类别的列表。请记住,每个插件都会注册自己的类别,因此,在安装或删除插件时,此列表可能会更改。

GST_DEBUG当 GStreamer 总线上发布的错误信息不能帮助您确定问题时使用。通常的做法是将输出日志重定向到一个文件,然后稍后检查它,搜索特定消息。

GStreamer 允许自定义调试信息处理程序,但使用默认处理程序时,调试输出中每一行的内容如下所示:

  0:00:00.868050000  1592   09F62420 WARN                 filesrc gstfilesrc.c:1044:gst_file_src_start:<filesrc0> error: No such file "non-existing-file.webm"

这就是信息的格式:

  | Example            | Explained                                                  |
  | ------------------ | ---------------------------------------------------------- |
  | 0:00:00.868050000  | Time stamp in HH:MM:SS.sssssssss format since the start of |
  |                    | the program.                                               |
  | 1592               | Process ID from which the message was issued. Useful when  |
  |                    | your problem involves multiple processes.                  |
  | 09F62420           | Thread ID from which the message was issued. Useful when   |
  |                    | your problem involves multiple threads.                    |
  | WARN               | Debug level of the message.                                |
  | filesrc            | Debug Category of the message.                             |
  | gstfilesrc.c:1044  | Source file and line in the GStreamer source code where    |
  |                    | this message was issued.                                   |
  | gst_file_src_start | Function that issued the message.                          |
  | <filesrc0>         | Name of the object that issued the message. It can be an   |
  |                    | element, a pad, or something else. Useful when you have    |
  |                    | multiple elements of the same kind and need to distinguish |
  |                    | among them. Naming your elements with the name property    |
  |                    | makes this debug output more readable but GStreamer        |
  |                    | assigns each new element a unique name by default.         |
  | error: No such     |                                                            |
  | file ....          | The actual message.                                        |
  +------------------------------------------------------------------------------+

2.2 添加自己的调试信息

在与 GStreamer 交互的代码部分中,使用 GStreamer 的调试工具很有趣。这样,您将所有调试输出都放在同一个文件中,并且保留了不同消息之间的时间关系。

为此,请使用、 GST_ERROR()GST_WARNING()和宏。它们接受与 相同的参数 ,并使用类别(将在输出日志中显示为 Debug 类别)。GST_INFO()GST_LOG()GST_DEBUG()printfdefaultdefault

要将类别更改为更有意义的内容,请在代码顶部添加这两行:

  GST_DEBUG_CATEGORY_STATIC (my_category);
  #define GST_CAT_DEFAULT my_category

然后在您使用以下命令初始化 GStreamer 后进行此操作 gst_init()

  GST_DEBUG_CATEGORY_INIT (my_category, "my category", 0, "This is my very own");

这会注册一个新类别(即,在您的应用程序期间:它不存储在任何文件中),并将其设置为您的代码的默认类别。请参阅GST_DEBUG_CATEGORY_INIT().

2.3 获取管道图

对于那些管道开始变得过大并且您无法跟踪与什么相关联的情况,GStreamer 具有输出图形文件的能力。这些是文件,可以使用GraphViz.dot等免费程序读取,它们描述了管道的拓扑结构,以及每个链接中协商的上限。

这在使用诸如playbin or之类的多合一元素时也非常方便uridecodebin,它会在其中实例化多个元素。使用这些.dot文件了解他们在内部创建的管道(并在此过程中学习一点 GStreamer)。

要获取.dot文件,只需将GST_DEBUG_DUMP_DOT_DIR环境变量设置为指向您希望放置文件的文件夹即可。gst-launch-1.0将在每次状态更改时创建一个.dot文件,因此您可以看到上限协商的演变。取消设置变量以禁用此功能。在您的应用程序中,您可以在方便时使用 GST_DEBUG_BIN_TO_DOT_FILE()GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()宏来生成.dot文件。

这里有一个 playbin 生成的管道示例。它非常复杂,因为playbin可以处理许多不同的情况:您的手动管道通常不需要这么长。如果您的手动管道开始变得非常大,请考虑使用playbin.

3. 结论

  1. 如何使用GST_DEBUG环境变量从GStreamer获取更多调试信息
  2. 如何将自己的调试信息与GST_ERROR()宏变量一起打印到GStreamer日志中
  3. 如何使用GST_DEBUG_DUMP_DOT_DIR环境变量获取管道图

后记