基础课程11:调试工具

news2024/9/29 11:39:31

目标

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

  • 如何从GStreamer获取更多调试信息。

  • 如何将自己的调试信息打印到GStreamer日志中。

  • 如何获得管道图(pipeline graphs)

打印调试信息

调试日志

GStreamer及其插件充满了调试跟踪,这是在代码中特别有趣的一块信息打印到控制台的地方,连同时间戳,进程,类别,源代码文件,函数和元素信息。

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

0:00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start: error: No such file “non-existing-file.webm”

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

第一类是调试级别,它是一个数字,通过数字指定了预期输出的内容:

#Name描述
0none没有debug信息输出
1EROOR记录所有致命错误。这些错误不允许核心或元素执行请求的操作。如果编程处理了触发错误的条件,应用程序仍然可以恢复。
2WARNING记录所有警告。通常情况下,这些不是致命的,但用户可见的问题是会发生的。
3FIXME记录所有“fixme”消息。那些通常是已知不完整的代码路径被触发。它在大多数情况下可能正常工作,但在特定情况下可能会导致问题。
4INFO记录所有info消息。它们通常用于系统中只发生一次的事件,或者是重要且罕见的事件,需要记录到此级别。
5DEBUG记录所有debug信息。这些是一般的调试消息,用于在对象的生命周期中只发生有限次的事件;这些操作包括设置、卸载、修改参数等。
6LOG记录所有log信息。这些消息是在对象的生命周期中反复发生的事件的消息;这包括streaming和steady-state。例如,这用于记录发生在元素中每个缓冲区上的消息。
7TRACE记录所有跟踪消息。这些都是经常发生的信息。例如,每次GstMiniObject(如GstBuffer或GstEvent)的引用计数被修改。
9MEMDUMP记录所有内存转储消息。这是最重要的日志记录,可能包括转储内存块的内容

要启用调试输出,请将GST_DEBUG环境变量设置为所需的调试级别。低于此级别(比如设置2,1等级的内容也会显示)的所有级别也将显示(即,如果设置GST_DEBUG=2,则将得到错误和警告消息)。

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

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

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

使用gst-launch-1.0 --gst-debug-help获取所有注册类别的列表。记住,每个插件都注册了自己的类别,所以当安装或删除插件时,这个列表可能会改变。

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

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

0:00:00.868050000 1592 09F62420 WARN filesrc gstfilesrc.c:1044:gst_file_src_start: error: No such file “non-existing-file.webm”

这是信息的格式:

ExampleExplained
0:00:00.868050000时间戳格式为HH:MM:SS.ssssssss自程序开始以来。
1592发出消息的进程ID。当您的问题涉及多个过程时非常有用。
09F62420线程发出消息的ID。当你的问题涉及多个线程时很有用。
WARN消息的Debug等级。
filesrc消息的Debug类别
gstfilesrc.c:1044发出此消息的GStreamer源代码中的源文件和行。
gst_file_src_start发出此消息的函数
<filesrc0>发出消息的对象的名称。它可以是一个element,一个pad,或者其他。当有多个同类元素需要区分时很有用。使用name属性命名元素可以使调试输出更具可读性,但GStreamer默认为每个新元素分配一个唯一的名称。
error: No such file …实际消息

增加你自己的调试信息

在与GStreamer交互的代码部分,使用GStreamer的调试功能会很有趣。通过这种方式,您将所有调试输出放在同一个文件中,并且不同消息之间的时间关系得到保留。

为此,可以使用GST_ERROR()GST_WARNING()GST_INFO()GST_LOG()GST_DEBUG()宏。它们接受与printf相同的参数,并且使用默认类别(default将在输出日志中显示为调试类别)。

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

GST_DEBUG_CATEGORY_STATIC (my_category);
#define GST_CAT_DEFAULT my_category

然后是在用gst_init()初始化GStreamer之后的代码:

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

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

Getting pipeline graphs

对于那些管道开始变得太大,并且无法跟踪element之间的连接情况,GStreamer具有输出图形文件的功能。这些是.dot文件,可以通过GraphViz等免费程序读取,它们描述了管道的拓扑结构,以及每个link中caps的协商情况。

当使用playbin或uridecodebin等一体化元素时,这也非常方便,因为它们实例化了其中的几个元素。使用.dot文件来了解它们在内部创建了什么管道(并在此过程中学习一些GStreamer)。

要获得.dot文件,只需将GST_DEBUG_DUMP_DOT_DIR环境变量设置为指向您想要放置文件的文件夹。gst-launch-1.0将在每次状态更改时创建一个.dot文件,因此您可以看到caps协商的演变。如果不设置GST_DEBUG_DUMP_DOT_DIR变量,则停止使用该功能。在你的应用程序中,你可以使用GST_DEBUG_BIN_TO_DOT_FILE()和GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS()宏生成.dot文件。

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

补充(pipeline graphs)

GST_DEBUG 示例

1.1 gst-launch-1.0

GST_DEBUG_NO_COLOR=1 GST_DEBUG_FILE=pipeline.log GST_DEBUG=5 gst-launch-1.0 audiotestsrc ! autoaudiosink

1.2 应用程序

#include <gst/gst.h>
#include <stdio.h>

GST_DEBUG_CATEGORY_STATIC (my_category);
#define GST_CAT_DEFAULT my_category

int main(int argc, char *argv[]) {
  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* gst初始化后初始 , 0日志字符表示无颜色输出, 1表示有颜色输出*/
  GST_DEBUG_CATEGORY_INIT (my_category, "my category", 0, "This is my very own");

  /* 通过以下函数,可以在自己的函数中添加debug调试信息 */
  GST_ERROR("My msg: %d", 0);
  GST_WARNING("My msg: %d", 1);
  GST_INFO("My msg: %d", 2);
  GST_DEBUG("My msg: %d", 3);

  return 0;
}
GST_DEBUG=5 ./a.out

2 gst-launch-1.0命令

2.1 生成dot

# 1.安装dot
sudo apt-get install graphviz
# 2.添加到环境变量,文件夹路径可以任意改变
export GST_DEBUG_DUMP_DOT_DIR=/home/lieryang/Pictures
# 3.运行管道
gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! matroskademux ! vp8dec ! videoconvert ! autovideosink

2.2 使用dot生成png图片

管道结束后,您可以看到.dot生成的文件,并且“* PLAYING_PAUSED *”通常用于生成图表。

ls
0.00.00.141932377-gst-launch.NULL_READY.dot
0.00.04.511918311-gst-launch.READY_PAUSED.dot
0.00.04.517318055-gst-launch.PAUSED_PLAYING.dot
0.00.56.729201365-gst-launch.PLAYING_PAUSED.dot
0.00.56.737842300-gst-launch.PAUSED_READY.dot

dot -Tpng 0.00.56.729201365-gst-launch.PLAYING_PAUSED.dot > 0.00.56.729201365-gst-launch.PLAYING_PAUSED.png

请添加图片描述

  • 橘黄色:src element 和 src pad
  • 紫色:sink element 和 sink pad
  • 绿色:一般的element(除src element 和sink element外)

2.3 C语言编写的应用程序

GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline");
//与上面宏的不同是,会在变量file_name前面加上时间戳
GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline");

ls
pipeline.dot
0.00.00.074939400-pipeline.dot

运行应用程序时前缀加上GST_DEBUG_DUMP_DOT_DIR=/home/hiccup/gst_pipeline

GST_DEBUG_DUMP_DOT_DIR=/home/hiccup/gst_pipeline ./application [参数1] [参数2] ...

当然,也可以通过g_setenv函数设置环境变量(切记:设定环境变量一定要在gst_init()初始化函数前面调用)。

g_setenv("GST_DEBUG_DUMP_DOT_DIR", "../pipeline-graph/", TRUE);

脚本助手

有时你可以生成很多不同的点文件。如果你想将它们每个都转换为PNG图片,可以使用这个脚本。指定点文件所在的文件夹(DOT_FILES_DIR),以及要放置生成的PNG文件的文件夹(PNG_FILES_DIR)。

DOT_FILES_DIR="./"
PNG_FILES_DIR="./"

DOT_FILES=`ls $DOT_FILES_DIR | grep dot`

for dot_file in $DOT_FILES
do
  png_file=`echo $dot_file | sed s/.dot/.png/`
  dot -Tpng $DOT_FILES_DIR/$dot_file > $PNG_FILES_DIR/$png_file
done

参考1:How to generate a GStreamer pipeline diagram
参考2:Gstreamer生成pipeline流图
参考3:Function Macros:GST_DEBUG_BIN_TO_DOT_FILE
参考4:Gstreamer&DeepStream生成pipeline图

结论

本教程展示了:

  • 如何使用GST_DEBUG环境变量从GStreamer获取更多调试信息。
  • 如何使用GST_ERROR()宏及其相关函数将您自己的调试信息打印到GStreamer日志中。
  • 如何使用GST_DEBUG_DUMP_DOT_DIR环境变量获取管道图。

很高兴在这里见到你,希望很快见到你!

参考1:Basic tutorial 11: Debugging tools
参考2:How to generate a GStreamer pipeline diagram

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电力电子器件简介

文章目录1、二极管2、BJT3、晶闸管&#xff08;SCR&#xff09;4、TRIAC5、GTO&#xff08;全控器件&#xff09;6、功率MOSFET&#xff08;开关速度快、电压驱动更容易&#xff09;7、IGBT8、总结![在这里插入图片描述](https://img-blog.csdnimg.cn/1d309b3d449040788c6437f8…

【胖虎的逆向之路】04——脱壳(一代壳)原理脱壳相关概念详解

【胖虎的逆向之路】04——脱壳&#xff08;一代壳&#xff09;原理&脱壳相关概念详解 【胖虎的逆向之路】01——动态加载和类加载机制详解 【胖虎的逆向之路】02——Android整体加壳原理详解&实现 【胖虎的逆向之路】03——Android一代壳脱壳办法&实操 文章目录【…

高速路如何避免ETC车辆漏计问题,ETC通道出入车辆校准看板

人群密集场所事故预防措施和应急管理方案的制定&#xff0c;对每一个交通枢纽和大型社会活动场所都显得尤为重要。对于交通管理部门来说&#xff0c;获取准确、可靠的交通数据已经变得越来越重要。 所以呢&#xff0c;ETC出入车辆校准看板是必要的。ETC出入车辆校准看板&#x…

如何使用路由策略解决 ISIS与OSPF双点双向产生的次优路径、环路隐患?

3.1.0 如何使用路由策略解决 ISIS与OSPF双点双向产生的次优路径、环路隐患 一、双点双向中的次优路径解决方法 双点双向中由于默认路由优先级造成次优路径的产生&#xff0c;而解决的方法就是修改路由优先级。 双点双向错误的解决方法 关于修改路由优先级&#xff0c;需要注…

2022 医疗卫生行业应急响应形势分析报告 脱敏板

声明 本文是学习2022医疗卫生行业网络安全分析报告. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 医疗卫生行业应急响应形势分析 2021年1-12月&#xff0c;奇安信集团安服团队共参与和处置全国范围内医疗卫生行业网络安全应急响应事件84起&#xf…

is not defined at HTMLInputElement.onclick

vue项目中一小部分功能想要使用原生的onclick 事件&#xff0c;发现报错Uncaught ReferenceError: 函数名 is not defined at HTMLInputElement.onclick搜索了相关blog&#xff0c;得出结论是onclick事件调用的方法必须是全局变量或者说是window的方法解决方法&#xff1a;将cl…

leetcode:43. 字符串相乘(附加一些C++string其他小练习)

目录 一.leetcode&#xff1a;43. 字符串相乘 1.问题描述 2.问题分析 3.问题求解 二. leetcode&#xff1a;541. 反转字符串 II 1.问题描述 2.题解 三. leetcode&#xff1a;125. 验证回文串 1.问题描述 2.双指针法求解 一.leetcode&#xff1a;43. 字符串相乘 43…

数据结构(括号匹配与表达式计算)

目录 括号配对 括号匹配算法 表达式计算 后缀式的计算 中缀式转后缀式 括号配对 编译器做语法检查的任务之一是检查符号是否配对&#xff0c;最简单的符号匹配问题是括号是否匹配&#xff0c;如开括号( 及{ 后面必须依次跟随相应的闭括号 }及 )。 如下段程序中的括号、引号…

谷歌竞价账户效果不好的原因?

很多外贸企业喜欢用谷歌竞价来推广自己的网站&#xff0c;提升自己的竞争力。是一种能很快看到效果的宣传方式。但是很多公司在谷歌竞价上投入了大量的资金&#xff0c;却收效甚微。为什么&#xff1f;下面我们来看看如何解决我们在google竞价推广中会遇到的一些问题。很多人在…

Linux的文件权限理解

目录 前言 1、用户、用户组、其他人 1.1用户、用户组、其他人之间的概念理解 1.2Linux系统中有用户身份与用户组记录的文件 2、Linux文件权限概念 第一列 第二列 第三列 第四列 第五列 第六列 第七列 Linux文件权限的重要性 3、Linux的目录与文件的权限意义 权限…

计算机图形学 第5章 二维变换与裁剪到Cohen-Sutherland直线裁剪算法

目录学习目标前驱知识规范化齐次坐标二维几何变换矩阵物体变换与坐标变换二维几何变换二维图形基本几何变换矩阵平移变换矩阵比例变换矩阵旋转变换矩阵反射变换矩阵错切变换矩阵二维仿射变换二维复合变换相对于任意方向的二维几何变换二维图形裁剪世界坐标系2.用户坐标系观察坐…

VSCode中设置Python语言自动格式化的方案

安装Python扩展 在VSCode的扩展&#xff08;Externsions&#xff09;中使用下面命令检索Python扩展 category:debuggers Python 打开一个Python文件&#xff0c;可以在VSCode的右下角看到运行环境。 安装PEP8 python3.10 -m pip install -U autopep8 安装Flake8 python3.10 …

上百个数字经济新场景 低代码完美搭建 实现项目落地

数字经济 自人类社会进入信息时代以来&#xff0c;数字技术的快速发展和广泛应用衍生出数字经济(Digital Economy)。与农耕时代的农业经济&#xff0c;以及工业时代的工业经济大有不同&#xff0c;数字经济是一种新的经济、新的动能&#xff0c;新的业态&#xff0c;其引发了社…

MicroBlaze系列教程(3):AXI_TIMER的使用

文章目录 @[toc]AXI_TIMER简介常用函数使用示例参考资料工程下载本文是Xilinx MicroBlaze系列教程的第3篇文章。 AXI_TIMER简介 AXI_TIMER支持两路可编程32位计数器,可以配置为中断、捕获、PWM模式,两个32位计数器可以级联为一个64位计数器。 IP核支持的最高频率: 常用…

nacos 服务发现获取列表源码分析

nacos 服务发现获取列表源码是注册中心最重要的技术点之一&#xff0c;其获取服务列表理论上是在首次接口调用时获取&#xff0c;有时候配置饥饿加载&#xff0c;即服务启动时就获取服务列表&#xff1a;今天我们从一个入口解析获取配置列表; 一、客户端源码 1、自动装配&…

推荐系统之推荐缓存服务

5.6 推荐缓存服务 学习目标 目标 无应用 无 5.6.1 待推荐结果的redis缓存 目的&#xff1a;对待推荐结果进行二级缓存&#xff0c;多级缓存减少数据库读取压力步骤&#xff1a; 1、获取redis结果&#xff0c;进行判断 如果redis有&#xff0c;读取需要推荐的文章数量放回&am…

(深度学习快速入门)第四章第一节:基础图像处理知识

文章目录一&#xff1a;位图和矢量图二&#xff1a;图像分辨率三&#xff1a;颜色模式&#xff08;1&#xff09;RGB&#xff08;2&#xff09;HSB&#xff08;2&#xff09;灰度图四&#xff1a;通道五&#xff1a;亮度、对比度和饱和度六&#xff1a;图像平滑和锐化&#xff…

D3股权穿透图

前言&#xff1a;最近做了一个项目&#xff0c;主要就是实现各种类似企查查的各种图谱&#xff0c;欢迎交流。后期将完成的谱图全部链接上&#xff0c;目前已大致实现了&#xff1a; 【企业关系图谱】、【企业构成图谱】、【股权穿透图】、【股权结构图】、【关联方认定图】 准…

【蓝桥杯基础题】2018年省赛—日志统计

&#x1f451;专栏内容&#xff1a;蓝桥杯刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录一、题目描述1.问题描述2.输入格式3.输出格式4.一个例子二、题目分析1、暴力法2、双指针三、代码汇总1、暴力代码汇总2、双…

【Mysql第一期 数据库概述】

文章目录1. 为什么要使用数据库2. 数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库特点2.3SQL优点3.常见的数据库介绍1.Oracle2.SQL Server3.MySQL4.Access5.DB26.PostgreSQL7.SQLite8.informix4. MySQL介绍4.1Mysql重大历史事件4.2 关于MySQL 8.04.3 Why choose MySQL?…