vscode调试gstreamer源码的详细流程

 更新时间:2023年01月05日 17:12:06   作者:hello_dear_you  
在本文中主要介绍了如何使用vscode调试C++和python程序,并进一步分析了如何调试gstreamer源码,讲述了如何调试gstreamer源码的具体流程,感兴趣的朋友跟随小编一起看看吧

1. 安装vscode插件

  • C/C++
  • C/C++ Extension

2. 配置文件修改

vscode中每个项目都有一套配置文件集合,位于.vscode目录下,其中有:

  • tasks.json:编译的相关配置
  • launch.json:debug的相关配置
  • c_cpp_properties.json:c/c++程序相关配置

2.1 自定义c_cpp_properties.json

{
    "configurations": [
        {
                "name": "Linux", # 配置标识符 linux, mac, win32
            "includePath": [
                    "${workspaceFolder}/**" #头文件搜索路径 
                    # **:表示递归搜索
            ],
            "defines": [],
                "compilerPath": "/usr/bin/gcc", # 编译器路径
            "cStandard": "gnu11",               # c语言的标准版本
            "cppStandard": "gnu++14",           # c++语言的标准版本
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

2.2 自定义tasks.json文件

{
    "tasks": [
        {
            "type": "shell",
            "label": "test",
            "command": "make",
            // "args": [
            //     "-fdiagnostics-color=always",
            //     "-g",
            //     "${file}",
            //     "-o",
            //     "${fileDirname}/${fileBasenameNoExtension}"
            // ],
            // "options": {
            //     "cwd": "${fileDirname}"
            // },
            // "problemMatcher": [
            //     "$gcc"
            // ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
    ],
    "version": "2.0.0"
}

其他参数含义:

  • workspaceFolder:打开的vscode目录
  • workspaceFolderBasename:workspaceFolder的根目录
  • fileDirname: 当前VsCode打开文件的目录
  • fileBasenameNoExtension:file里每个文件不带后缀

2.3 Debug

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "test",
            "type": "cppdbg",
            // debug的模式,分为launch和attach两种
            "request": "launch",
            // 程序可执行文件的完整路径
            "program": "${workspaceFolder}/deepstream-test-rt-src-add-del", 
            // 传递给程序的命令行参数
            "args": ["file:///opt/nvidia/deepstream/deepstream-6.0/samples/streams/sample_720p.h264"],
            // 可选参数。如果为 true,则调试程序应在目标的入口点处停止
            "stopAtEntry": false,
            // 目标的工作目录
            "cwd": "${workspaceFolder}",
            // 要添加到程序环境的环境变量
            "environment": [],
            "externalConsole": false,
            // 指示 MIDebugEngine 要连接到的控制台调试程序。允许的值为 "gdb"、"lldb"。
            "MIMode": "gdb",
            
            "setupCommands": [
                {
                "description": "Enable pretty-printing for gdb",
                "text": "-enable-pretty-printing",
                "ignoreFailures": true
                }
            ],
            // 调试会话开始前要运行的任务
            "preLaunchTask": "test",
            // MI 调试程序(如 gdb)的路径。如果未指定,将首先在路径中搜索调试程序
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

3. Makefile环境下

使用 -g 来启动调试环境

4. Python调试

{
  // 使用 IntelliSense 了解相关属性。 
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "test",
      "type": "python",
      "request": "launch",
      "program": "${workspaceRoot}/tools/inference.py",
      "args": ["--config", "anomalib/models/padim/config.yaml", "--weight_path", "results/padim/mvtec/test7/weights/model.ckpt", 
        "--image_path", "datasets/MVTec/test7/train/good/", "--save_path", "results/padim/mvtec/test7/train_data"],
      "console": "integratedTerminal",
      "cwd":"${workspaceRoot}",
      "justMyCode": true
    }
  ]
}

5. 调试gstreamer源码

GStreamer 是用来构建流媒体应用的开源多媒体框架(framework),其目标是要简化音/视频应用程序的开发.

下载gstreamer源码

使用gst-inspect1.0工具可以获取gstreamerelement的信息,以multifilesrc element为例,输入如下命令:

gst-inspect-1.0 multifilesrc

即可输出下图的信息,找到源码下载地址。

在这里插入图片描述

选择如下版本

在这里插入图片描述

下载源码,解压

在这里插入图片描述

编译源码

编译源码可以参考如下文章【编译gstreamer插件-multifilesrc

修改Makefile

搜索-g选项信息

在这里插入图片描述

-O2选项修改未-O0

在这里插入图片描述

重新编译得到动态库

root@2a2466b40131:~/homework/gst_plugin_good/gst/multifile# make
CC       test_splitmux_part_reader-test-splitmuxpartreader.o
CC       test_splitmux_part_reader-gstsplitmuxpartreader.o
CC       test_splitmux_part_reader-gstsplitmuxsrc.o
CC       test_splitmux_part_reader-gstsplitutils.o
CC       test_splitmux_part_reader-patternspec.o
CCLD     test-splitmux-part-reader
CC       libgstmultifile_la-gstmultifilesink.lo
CC       libgstmultifile_la-gstmultifilesrc.lo
CC       libgstmultifile_la-gstmultifile.lo
CC       libgstmultifile_la-gstsplitfilesrc.lo
CC       libgstmultifile_la-gstsplitmuxsink.lo
CC       libgstmultifile_la-gstsplitmuxpartreader.lo
CC       libgstmultifile_la-gstsplitmuxsrc.lo
CC       libgstmultifile_la-gstsplitutils.lo
CC       libgstmultifile_la-patternspec.lo
CCLD     libgstmultifile.la

4.将动态库拷贝到系统路径下

make install 
cp /root/homework/gst_plugin_good/bin/lib/gstreamer-1.0/libgstmultifile.so /usr/lib/x86_64-linux-gnu/gstreamer-1.0/

修改launch.json文件内容

launch.json文件内容重点需要修改如下三个参数:

在这里插入图片描述

整个launch.json文件内容如下,具体测试的pipeline如下:

gst-launch-1.0 multifilesrc location=test%d.jpg ! jpegparse ! jpegdec ! videoconvert ! jpegenc ! multifilesink location=output%d.jpg
{
  // 使用 IntelliSense 了解相关属性。 
  // 悬停以查看现有属性的描述。
  // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "name": "test",
      "type": "cppdbg",
      // debug的模式,分为launch和attach两种
      "request": "launch",
      // 程序可执行文件的完整路径
      "program": "/usr/bin/gst-launch-1.0",
      // 传递给程序的命令行参数
      "args":["multifilesrc", "location=test%d.jpg", "!", "jpegparse", "!", "jpegdec", "!", "videoconvert", "!", "jpegenc", "!", "multifilesink", "location=output%d.jpg"],
      // 可选参数。如果为 true,则调试程序应在目标的入口点处停止
      "stopAtEntry": false,
      // 目标的工作目录
      "cwd": "${workspaceFolder}/data",
      // 要添加到程序环境的环境变量
      "environment": [],
      "externalConsole": false,
      // 指示 MIDebugEngine 要连接到的控制台调试程序。允许的值为 "gdb"、"lldb"。
      "MIMode": "gdb",

      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      // 调试会话开始前要运行的任务
      // "preLaunchTask": "test",
      // MI 调试程序(如 gdb)的路径。如果未指定,将首先在路径中搜索调试程序
      "miDebuggerPath": "/usr/bin/gdb"
    }
  ]
}

输入断点

在如下gst_multi_file_src_set_location函数中打上断点,按F5启动调试,即可进行调试

在这里插入图片描述

总结

在本文中,主要介绍了如何使用vscode调试C++和python程序,并进一步分析了如何调试gstreamer源码,讲述了如何调试gstreamer源码的具体流程。

到此这篇关于vscode调试gstreamer源码的文章就介绍到这了,更多相关vscode调试gstreamer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言 详细解析时间复杂度与空间复杂度

    C语言 详细解析时间复杂度与空间复杂度

    算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小
    2022-04-04
  • C语言中调用汇编语言详解

    C语言中调用汇编语言详解

    这篇文章主要介绍了C语言中调用汇编语言,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • C++详细讲解内存管理工具primitives

    C++详细讲解内存管理工具primitives

    文章向大家介绍C++内存管理primitives,主要包括primitives使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • C++ 右值引用与 const 关键字详解

    C++ 右值引用与 const 关键字详解

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,const关键字是一种修饰符,这篇文章主要介绍了C++ 右值引用与 const 关键字,需要的朋友可以参考下
    2022-10-10
  • C++实现LeetCode(93.复原IP地址)

    C++实现LeetCode(93.复原IP地址)

    这篇文章主要介绍了C++实现LeetCode(93.复原IP地址),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 一文详解Qt如何读取和写入配置文件的数据

    一文详解Qt如何读取和写入配置文件的数据

    这篇文章主要为大家详细介绍了在Qt中如何实现读取和写入配置文件的数据,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • 深入解析函数指针与返回函数的指针

    深入解析函数指针与返回函数的指针

    以下是对函数指针与返回函数的指针进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • 用C++实现,将一句话里的单词进行倒置的方法详解

    用C++实现,将一句话里的单词进行倒置的方法详解

    本篇文章是对用C++实现,将一句话里的单词进行倒置的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    这篇文章主要介绍了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以参考下
    2017-04-04
  • C++判断矩形相交的方法

    C++判断矩形相交的方法

    这篇文章主要介绍了C++判断矩形相交的方法,涉及C++针对平面坐标数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论