背景

如果你是一个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. P4451-[国家集训队]整数的lqp拆分【生成函数,特征方程】

    正题 题目链接:https://www.luogu.com.cn/problem/P4451 题目大意 给出\(n\),对于所有满足\(\sum_{i=1}^ma_i=n\)且\(\forall a_ ...

  2. jmx_prometheus_javaagent+prometheus+alertmanager+grafana完成容器化java监控告警(二)

    一.拓扑图 二.收集数据 2.1前期准备 创建共享目录,即为了各节点都创建该目录,有两个文件,做数据共享 /home/target/prom-jvm-demo 1.下载文件 jmx_prometheu ...

  3. 手机淘宝轻店业务 Serverless 研发模式升级实践

    一.前言 随着 Serverless 在业界各云平台落地,阿里内部 Serverless 研发平台.各种研发模式也在业务中逐步落地,如火如荼.在此契机下,淘系团队启动了轻店 Serverless 研发 ...

  4. 题解 「ZJOI2018」历史

    题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...

  5. 洛谷4219 BJOI2014大融合(LCT维护子树信息)

    QWQ 这个题目是LCT维护子树信息的经典应用 根据题目信息来看,对于一个这条边的两个端点各自的\(size\)乘起来,不过这个应该算呢? 我们可以考虑在LCT上多维护一个\(xv[i]\)表示\(i ...

  6. Windows使用Git的vim编辑器编译运行程序

    Windows配置gcc 新建一个main.c $ touch main.c #在当前目录下创建main.c $ mkdir folder #在当前目录下创建folder文件夹 $ rm main.c ...

  7. NX Open 切削层加载

    UF_CUT_LEVELS_load Loads the current cut levels for the specified operation into the data structure ...

  8. 【UE4 设计模式】享元模式 Flyweight Pattern

    概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...

  9. Java序列元素替换

    1.数组 直接赋值. 2.String (1) String是不可变的,只能将新的字符串重新赋给String变量.可使用substring进行拼接: String s="hello" ...

  10. [对对子队]会议记录5.14(Scrum Meeting1)

    今天已完成的工作 何瑞 ​ 工作内容:初步完成循环指令系统 ​ 相关issue:实现循环语句系统的逻辑 ​ 相关签入:feat:循环语句的指令编辑系统初步完成 吴昭邦 ​ 工作内容:将流水线系统和循环 ...