背景

如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可。但是如果你想调试FFmpeg内部相关的逻辑,或者分析FFmpeg源码,那么有一个可供单步调试FFmpeg的环境往往能使你事半功倍。

步骤

本文将介绍如何在Linux下(以Ubuntu 18.04 LTS为例)通过FFmpeg源码(以4.4版本为例)编译出一个相对简洁的FFmpeg可执行程序,并通过gdb或者VS Code对其进行单点调试。

获取源码

首先从FFmpeg的官方github获取对应的源码:

https://github.com/FFmpeg/FFmpeg

本文将以release/4.4分支版本的源码为例:

git clone https://github.com/FFmpeg/FFmpeg.git -b 4.4/release

编译

如上文所说,既然是要编译FFmpeg的相对简洁的版本,就意味着编译出来的库的功能并非大而全,本文也仅仅是为了演示如何编译与调试FFmpeg,不希望有太多额外的库依赖步骤(以免扰乱初学者的学习节奏)。

若有需要调试额外的功能(如x264),只需要在编译FFmpeg的时候打开对应的功能(如 --enable-x264)再重新编译即可,本文不做赘述。

和Linux下绝大多数编译步骤一样,先执行./configure来配置项目;在执行FFmpeg的./configure的时候记得打开调试选项--enable-debug以保留调试符号,方便我们后续调试:

cd FFmpeg
./configure --disable-shared --enable-static --disable-asm --enable-debug
make
# 编译相对耗时,请耐心等待..

好了,经过漫长的编译等待过程,我们可以看到当前目录下有多了ffmpeg_gffprobe_g2个文件,这2个结尾带_g的便是携带了编译符号可调试的可执行文件。

调试

我们以最简单的查看ffmpeg版本的命令为例:

./ffmpeg_g -version

来分别介绍如何使用gdb或者VS Code对程序进行单步调试。


使用gdb调试ffmpeg

首先运行gdb,指定调试程序:

gdb ./ffmpeg_g

好了,接下来的命令都是在gdb的交互中进行。

先设置运行参数为-version:

set args -version

将断点打在main函数入口处:

b main

设置显示源码布局:

layout src

开始运行程序:

run

此时遇到断点main会自动停下:

关于gdb的相关操作不是本文的重点,请自行搜索学习,如果本文不做赘述。

如果希望能够更方便地在gdb调试过程中参照源码,可以尝试使用cgdb这个工具,它其实就是基于gdb包装多了一层命令行可视化交互界面,方便在调试过程中边看源码边调试,详情可以查看本号的文章:cgdb | 一起边看源码边调试gdb吧


使用VS Code调试ffmpeg

如今的VS Code经过多个版本的迭代,已经不仅仅是一个简单的编辑器,开发者通过各个强大的插件可以把它打造成一个类IDE的工具。

在Ubuntu的环境下你可以通过直接安装Linux版本的VS Code来使用,当然你也可以在其他系统上安装好VS Code然后通过Remote - SSH插件来远程打开你的源码工程。

言归正传,要使用VS Code来调试C/C++项目,需要至少先安装如下2个VS Code插件:

  • C/C++
  • C/C++ Runner

首先,你需要在VS Code中打开你的ffmpeg目录。

然后在VS Code中同时按下Ctrl + Shift + P打开输入"launch.json",选择Open 'launch.json' 来打开调试的启动配置文件,主要修改以下关键地方:

// 把要调试的程序路径填好:
"program": "${fileDirname}/../ffmpeg_g", // 运行参数为 -version:
"args": ["-version"],

注释掉"preLaunchTask"一行,因为我们已经编译过了,也不想使用它默认的编译步骤

// "preLaunchTask": "C/C++: gcc 生成活动文件",

总体的配置如下,修改完记得保存文件:

{
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/../ffmpeg_g",
"args": ["-version"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// "preLaunchTask": "C/C++: gcc 生成活动文件",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}

好了,此时你可以打开想要调试的文件,以本次要调试的ffmpeg_g为例,打开ffmpeg.c文件,然后把鼠标挪到行号的左边会出现一个淡淡的小红点,点下之后会显示红点,代表你在本行打了一个断点。

此时按下F5键,会启动调试模式,并把断点停留在你打的断点处:

你可以点击上方的工具栏来执行相关调试操作,也可以使用快捷键来进行操作:

  • F5:继续执行
  • F10:单步跳过
  • F11:单步调试
  • Shift + F11:单步跳出
  • Shift + F5:停止调试

左边的DEBUG工具栏可以让你轻松地查看本地变量寄存器,可以添加相关的变量监视,也可以查看函数的调用堆栈等信息。

关于VS Code调试C/C++的步骤非本文重点,网上有很多教程,请自行搜索学习。




欢迎关注我的公众号^^

Linux下搭建FFmpeg开发调试环境的更多相关文章

  1. Windows下搭建FFmpeg开发调试环境

    背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可. 但是如果你想调试FFmpeg内部相关的逻辑,或 ...

  2. Linux下搭建C/C++编程环境

    Linux下搭建C/C++编程环境 1.KDevelop下载 wget -O KDevelop.AppImage https://download.kde.org/stable/kdevelop/5. ...

  3. golang在Windows下Sublime Text开发调试环境的配置

    一.前言 近期本人有工作调动,进入了一个全新的领域[golang]服务端开发.在此写下本文,希望给那些没接触过golang开发调试环境及还在犹豫选择那家golang IDE而纠结的朋友们一点点帮助,如 ...

  4. windows环境下搭建ffmpeg开发环境

           ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...

  5. linux下搭建php的集成环境

    一个偶然的机会,在项目中需要搭建PHP的环境,由于PHP开发需要的东西比较多,像apache.mysql.PHP环境等,如果一个一个装很可能会有安装不全的问题,为此选择了安装集成环境,这里选择的是xa ...

  6. Linux下搭建hadoop开发环境-超详细

    先决条件:开发机器需要联网 已安装java 已安装Desktop组 1.上传安装软件到linux上: 2.安装maven,用于管理项目依赖包:以hadoop用户安装apache-maven-3.0.5 ...

  7. linux下搭建java开发环境

    1 下载jdk包 这里下载.gz格式的,通过ftp上传到服务器 2 解压到指定目录,如/usr/java/ tar -xvf XXX.tar.gz 解压后会在/usr/java下生成一个目录,如jdk ...

  8. Linux下搭建PHP开发环境(LAMP)

    LAMP:Linux+Apache+Mysql/MariaDB+Perl/PHP/Python 一键安装方法如下: 注:Ubuntu下可使用sudo su 命名切换到root用户. 开始安装之前,先执 ...

  9. linux 下搭建go开发环境

随机推荐

  1. P4320-道路相遇,P5058-[ZJOI2004]嗅探器【圆方树,LCA】

    两题差不多就一起写了 P4320-道路相遇 题目链接:https://www.luogu.com.cn/problem/P4320 题目大意 \(n\)个点\(m\)条边的一张图,\(q\)次询问两个 ...

  2. 常见错误0xCCCCCCCCC 读取字符串的字符时出错及其引申。

    问题描述在一个函数调用中,使用二级指针作为函数参数,传递一个字符串指针数组,但是在访问的时候,却出现了运行时错误,具体表现为"0xCCCCCCCC 读取字符串的字符时出错". 第一 ...

  3. Go语言之循环与条件判断

    一.for循环 Go 语言中没有 while 循环,只有一个 for 循环 for 变量初始化;条件;变量自增/自减 { 循环体内容 } 1.基本使用 for i := 0; i < 10; i ...

  4. cadvisor+prometheus+alertmanager+grafana完成容器化监控告警(一)

    一.概况 1.拓扑图 2.名词解释 Grafana 可视化监控容器运行情况 Prometheus: 开源系统监视和警报工具包 Alertmanager 一个独立的组件,负责接收并处理来自Prometh ...

  5. 分片利器 AutoTable:为用户带来「管家式」分片配置体验

    在<DistSQL:像数据库一样使用 Apache ShardingSphere>一文中,Committer 孟浩然为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了 ...

  6. 运行WampServer提示计算机中丢失 msvcr110.dll

    ​ 在第一次运行WampServer的时候,出现"无法启动此程序,因为计算机中丢失 MSVCR110.dll.尝试重新安装该程序以解决此问题. ​ 在浏览器的地址栏里输入 http://ww ...

  7. 在IDEA中创建SpringBoot项目01

    1.选择创建项目 2.填写项目信息 3. 4. 5.Finish后会下载,之后生成目录结构: 6.在自己的包目录结构下添加了Controllr和Entiy测试项目: Controller: 1 pac ...

  8. Servlet和Servlet容器

    Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容, Servlet是平台独立的Java类,编写一个S ...

  9. cassandra表中主键的类型

    cassandra表中主键的类型及区分? 一.类型及区分 二.参考文章 一.类型及区分 Cassandra的4种Key Primary Key 主键 Composite Key,Compound Ke ...

  10. 多边形——————区间dp

    原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...