调试FFmpeg

小程之前介绍了怎么编译FFmpeg,编译之后使用二进制库的方式来调用FFmpeg,这时FFmpeg就像一个黑盒子。

作为程序员的读者,特别是想研究FFmpeg的具体实现(比如是怎么拿到歌曲信息的、怎么解码的、怎么推流的,等等)的读者,难道就不想调试一下这个“黑盒子”吗?

看源码是理解代码实现的一个办法,而单步调试是更加具体有效的理解代码实现的办法,因为这个办法可以看到具体数据的流转。

本文介绍如何单步调试FFmpeg的代码。

(一)为什么要调试

调试的好处,一来可以理解程序的执行流程,二来有助于定位问题。

相对于看源码,单步调试,可以看到数据的变化,会深刻很多,而且定位问题时也直观快速,读者甚至可以修改变量的值或下条件断点,充分发挥调试器的功能。

所以调试是理解代码与定位问题的有效办法。

(二)怎么调试

小程用的是mac机。

接下来小程再次介绍FFmpeg的编译,但只是简单介绍,读者可以关注“广州小程”微信公众号,查阅之前有详细介绍的文章。

(0)下载FFmpeg源码

git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
或者:
curl -0 http://ffmpeg.org/releases/ffmpeg-${VERSION}.tar.bz2
tar jxvf ffmpeg-${VERSION}.tar.bz2
VERSION设置为最新的ffmpeg版本号。

至于用什么工具来打开这些源码文件,读者应该考虑适合自己,而且适合看大型项目的工具,比如sourceinsight、sublime、vim、emacs、xcode、Android Studio之类。

(1)编译FFmpeg

编译要使用到编译器,在mac机上最简单的办法就是安装xcode了,这样保证编译器clang是存在的。

为了调试,这次的编译可以很简单,只要把优化选项去掉,再make即可:

make clean
./configure --disable-optimizations
make

configure是FFmpeg提供的配置脚本,用来生成Makefile跟config.h文件,Makefile在编译时使用,而config.h(里面各种宏的定义)被FFmpeg源码使用,也会影响到FFmpeg的功能裁剪。

对于configure的参数,读者也可以通过./configure --help来查看所有的选项,然后再找到关于优化的选项。

这里的make clean,是为了清一下之前的编译污染,如果之前没有编译过,那就不需要执行。

另外,如果make之后,再执行make install,就会把FFmpeg安装到mac系统。对于调试来说这个是不重要的,只要make出二进制库就好了。

成功编译后,可以看这几个文件:

(2)用gdb调试FFmpeg

对于喜欢用命令行的读者,使用gdb或lldb来进行调试是不错的选择。

在使用gdb前,需要安装并给gdb签名,如果读者还没有准备好gdb,并且有兴趣使用gdb的话,可以阅读分割线以内的内容,这里面也包括了gdb常用的命令。



安装gdb:

brew install homebrew/dupes/gdb

对gdb授权,参照:https://blog.csdn.net/cairo123/article/details/52054280

写一个测试的例子:

edit gdbtest.c:
int main() {
int a = 10;
printf("%d\n");
}

编译:

gcc -o gdbtest gdbtest.c -g

注意须带-g,以生成符号dSYM文件。

然后就可以调试了,常用命令有这些:

gdb gdbtest --加载可执行程序
r --run,运行,可以带参数
i b --info break,断点信息
b 3 --break 3,第3行下断点
b main --main函数第一行下断点
b other_c:fun1 --文件other_c的fun1函数第一行下断点
b 120 --在120行下断点
clear --删除所有断点
d 3 --delete 3,删除断点3
disable 1 --禁用断点1
enable 1 --启用断点1
s --step,跳进去
f --finish,跳出来
n --next,执行一行
n 3 --next 3,执行3行
c --continue,继续直至下一个断点或结束
p a --print a,输出变量a的值
list/l --查看代码
q/kill --退出本次调试
bt --查看调用堆栈
return --把当前函数return



为了便利,小程直接用FFmpeg的程序来切入调试(当然也可以写自己的代码来调用FFmpeg),比如可以选择ffplay_g这个程序来切入,调试它所依赖的基础即FFmpeg。

调试ffplay_g需要输入参数,在gdb ffplay_g后,r "xxx/file.mp3"即可,表示用ffplay_g来播放这个文件。

以下是小程使用gdb来简单调试的演示视频:

需要留意,带_g的是带有调试信息的程序,那是调试需要的。

(3)用xcode来调试FFmpeg

显然,使用gdb来调试,对于阅读代码或操作都不算太直观,这时,读者可以考虑用xcode来调试FFmpeg。

小程这里不介绍每个配置环节了,因为,读者可以参考以下这一篇图文并茂的文章,按步操作就可以了:
<http://www.jianshu.com/p/226c19aa6e42&gt;

至此,已经介绍完怎么调试FFmpeg。



总结一下,本文介绍了如何在macos上调试FFmpeg的源码,包括使用gdb或xcode来调试的办法,同时也介绍了如何编译带有调试信息的FFmpeg。从操作的角度来说,难度系数为2。

原文地址:http://blog.51cto.com/13136504/2093131

时间: 2024-11-03 12:14:24

调试FFmpeg的相关文章

使用 VS2015 编译并调试 ffmpeg

导读 ffmpeg 是音频处理方面非常强大非常有名的开源项目了,然而如 雷神 所说,“FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大,不太适合刚接触 FFMPEG 的人学习:而且很多的例子程序编译通不过,极大地打消了学习的积极性”,对于平时只习惯在 Windows 下开发的开发的初学者来说,从零开始了解相关依赖,搭建起项目并调试 ffmpeg 并不是件容易的事,好在另一个非官方的 开源项目,提供了一整套 Windows 下,用 V

在VC2015中调试FFMPEG

编译X264需要至少 VS2013 update 2 以上版本. 本文使用 VS2015. 示例工程:https://github.com/gitgjogh/FFmpeg-gitgjogh/tree/msvc/build_msvc Build Libav*** Using MSVC Compiler Under MINGW32 Import vcvar Into MSYS (MINGW32) Scheme#1: From Start Menu->vs2015->tools->VS2015

eclipse+minGW 调试ffmpeg错误:No symbol table is loaded. Use the &quot;file&quot; command.

转载地址:http://www.blogjava.net/fancydeepin/archive/2012/11/19/391520.html 数据结构第二篇:  eclipse SDK 安装和配置 GDB 为 C/C++ 开发环境提供 debug 调试背景:  debug 的时候出现 Error while launching command: gdb.exe --version 异常原因:  没有安装 gdb 调试工具.听说,最新的 MinGW 已集成 GDB 调试工具,本人安装的 MinG

ubuntu下调试ffmpeg程序出现undefined reference to pthread_once ,undefined reference to uncompress错误

Ubuntu(版本16.04)下默认配置编译Ffmpeg(版本4.1.3configure 添加选项--enable-threads),将编译好的ffmpeg库添加到程序 中进行编译出现undefined reference to pthread_once ,undefined reference  to uncompress 等错误,提版本示pthread_once 未定义原因是编译链接时找不到pthread_one.解决的方法是安装pthread并将它链接到程序.具体安装的命令是: sudo

ffmpeg调试相关知识点

1.若要调试FFMPEG,在编译时应当在configure时,加上 --enable-debug --disable-asm 注:在调试x264时就应该加上这两个配置选项,方能调试 2.make install 会执行strip命令,strip命令就会去掉FFMPEG的symbols(符号表),这就相当于--disable-debug这个默认选项install了,怎么避免strip命令将先前的配置给去掉呢? 在configure时加上 --disable-stripping选项 看原帖讨论地址:

Android/NDK环境下FFmpeg及AAC,MP3,X264的编译

本篇介绍在Android/Ndk环境下FFmpeg的编译及使用, FFmpeg自带了H264.AAC.MP3的解码器,但却没有(或没有好的)相应的编码器.相应的编码器需要使用第三方库.推荐使用的第三方库为x264(H264编码) .FDK_AAC(AAC编码),lame(MP3编码). 在顺序上,应该先编译好第三方库,最后再编译FFmpeg库. [本书说明:本文作者:邵发,本文选自<FFmpeg视音频编程指南>.有关本书的详细信息请访问官网:http://www.afanihao.cn ] [

ffmpeg学习笔记目录

1.命令使用 最开始看一下ffmpeg命令的中文解释,然后ffmpeg的基本用法,日常命令使用中最多的ffmpeg调用x264编码.mpeg4中的deblocking的用法,x264中输出值含义,x264编码之码率控制,x264参数介绍之一,x264参数介绍之二. 2.编译ffmpeg win7用mingw+msys编译ffmpeg 编译中遇到的文题解决 各个组件下载地址,及编译方法,问题处理 ffmpeg.exe用vs2010编译 ffmpeg库移植vs下所需步奏 ffmpeg编译libxml

编译vs下可调试的ffmpeg和x264

以前随手记的笔记,翻出来,整理下哈 ffmpeg 在windows上的编译还是比较麻烦的,而且如果mingw-gcc编译的话,是无法在vs下调试的 所以以前刚开始玩ffmpeg的时候,费了一些功夫,用vs编译调试ffmpeg,当然在mingw下调试也是可以的. 由于是之前的笔记,所以有些地方不是很详细,主要记录了一些关键的地方. 也可以直接下载编译配置好的vs2013工程. 一.准备工具 1. msysgit 环境,https://github.com/msysgit/msysgit/ 2. 然

gcc悄无声色将静态函数内联了

说到内联,可能你还停在十几年前甚至二十多年前的C++教典,c++有内联关键字inline,甚至还用来与c做区分.c99开始c引入inline,gcc比c99早实现对inline支持,vc中c没有关键字inline,inline只能用于c++,但有另一关键字__inline,但若你要用vc编译gcc下c代码,遇到cl抱怨不识别inline,只要将inline在预编译宏中定义为__inline也就可以了. gcc编译器属性中还有一个noinline,有了inline为什么还要来一个noinline.