Linux下搭建FFmpeg开发调试环境
背景
如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*
相关的头文件,然后在编译阶段链接相关的库即可。但是如果你想调试FFmpeg内部相关的逻辑,或者分析FFmpeg源码,那么有一个可供单步调试FFmpeg的环境往往能使你事半功倍。
步骤
本文将介绍如何在Linux下(以Ubuntu 18.04 LTS为例)通过FFmpeg源码(以4.4版本为例)编译出一个相对简洁的FFmpeg可执行程序,并通过gdb
或者VS Code
对其进行单点调试。
获取源码
首先从FFmpeg的官方github获取对应的源码:
本文将以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_g
和ffprobe_g
2个文件,这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开发调试环境的更多相关文章
- Windows下搭建FFmpeg开发调试环境
背景 如果你是一个FFmpeg的使用者,那么绝大部分情况下只需要在你的程序中引用FFmpeg的libav*相关的头文件,然后在编译阶段链接相关的库即可. 但是如果你想调试FFmpeg内部相关的逻辑,或 ...
- Linux下搭建C/C++编程环境
Linux下搭建C/C++编程环境 1.KDevelop下载 wget -O KDevelop.AppImage https://download.kde.org/stable/kdevelop/5. ...
- golang在Windows下Sublime Text开发调试环境的配置
一.前言 近期本人有工作调动,进入了一个全新的领域[golang]服务端开发.在此写下本文,希望给那些没接触过golang开发调试环境及还在犹豫选择那家golang IDE而纠结的朋友们一点点帮助,如 ...
- windows环境下搭建ffmpeg开发环境
ffmpeg是一个开源.跨平台的程序库,能够使用在windows.linux等平台下,本文将简单解说windows环境下ffmpeg开发环境搭建过程,本人使用的操作系统为windows ...
- linux下搭建php的集成环境
一个偶然的机会,在项目中需要搭建PHP的环境,由于PHP开发需要的东西比较多,像apache.mysql.PHP环境等,如果一个一个装很可能会有安装不全的问题,为此选择了安装集成环境,这里选择的是xa ...
- Linux下搭建hadoop开发环境-超详细
先决条件:开发机器需要联网 已安装java 已安装Desktop组 1.上传安装软件到linux上: 2.安装maven,用于管理项目依赖包:以hadoop用户安装apache-maven-3.0.5 ...
- linux下搭建java开发环境
1 下载jdk包 这里下载.gz格式的,通过ftp上传到服务器 2 解压到指定目录,如/usr/java/ tar -xvf XXX.tar.gz 解压后会在/usr/java下生成一个目录,如jdk ...
- Linux下搭建PHP开发环境(LAMP)
LAMP:Linux+Apache+Mysql/MariaDB+Perl/PHP/Python 一键安装方法如下: 注:Ubuntu下可使用sudo su 命名切换到root用户. 开始安装之前,先执 ...
- linux 下搭建go开发环境
随机推荐
- [模板]多项式全家桶小记(求逆,开根,ln,exp)
前言 这里的全家桶目前只包括了\(ln,exp,sqrt\).还有一些类似于带余数模,快速幂之类用的比较少的有时间再更,\(NTT\)这种前置知识这里不多说. 还有一些基本的导数和微积分内容要了解,建 ...
- Redis之品鉴之旅(六)
持久化 快照的方式(RDB) 文件追加方式(AOF) 快照形式: save和bgsave能快速的备份数据.但是.........., Save命令:将内存数据镜像保存为rdb文件,由于redis是单线 ...
- Codeforces Round #747 (Div. 2)
比赛地址 A(水题) 题目链接 题目: 给出指定\(n\),求解出一段区间\([l,r]\)使得\(\sum\limits_{i=l}^ri=n\) 解析: 从点0,1两点作为起点分别向左右延伸长度, ...
- NOIP模拟73
T1 小L的疑惑 解题思路 第一眼不是正解,又是 bitset 优化可以得到的 60pts 的部分分. 打着打着突然发现这个东西好像和之前做过的某个题有一些相似,试着打了一下. 然后样例过了,然后对拍 ...
- Java多线程--实现同步的9种方法
我们通常说的保持同步,其实就是对共享资源的保护.在单线程模型中, 我们永远不用担心"多个线程试图同时使用同一个资源的问题", 但是有了并发, 就有可能发生多个线程竞争同一个共享资源 ...
- 安全通信协议SSH应用与分析
一.实验简介: 本次实验属于安全协议应用与分析系列 二 实验环境: Windows server 2003 server windows xp 做client 三.实验目的 通过该实验了解SSH服务器 ...
- mysql增删改查——条件查询+模糊查询
条件查询一般是 = 等于 >大于 <小于 >=大于等于 <=小于等于 <>区间 between and区间 or并且 and或者 in包含 like模糊查询 实例, ...
- Linux信号处理编程
01. 学习目标 了解信号中的基本概念 熟练使用信号相关的函数 了解内核中的阻塞信号集和未决信号集作用 熟悉信号集操作相关函数 熟练使用信号捕捉函数signal 熟练使用信号捕捉函数sigaction ...
- Egg.js学习与实战系列 · 文件上传配置
在使用Egg.js搭建文件上传服务时,遇到了几个一般新手都会遇到的坑. 经查阅官方文档,Egg框架中默认使用egg-multipart插件进行文件上传,所以上传文件前需要做相关的配置. 上传文件提示: ...
- [对对子队]会议记录4.17(Scrum Meeting8)
今天已完成的工作 何瑞 工作内容:修复了一些bug,优化了UI 相关issue:搭建关卡1 相关签入:4.17签入1 吴昭邦 工作内容:做了一些流水线系统的错误处理,添加了合成失败了之 ...