乐趣区

关于调试:多媒体开发8调试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/cairo12…

写一个测试的例子:

touch 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/226c…

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

总结一下,本文介绍了如何在 macos 上调试 FFmpeg 的源码,包含应用 gdb 或 xcode 来调试的方法,同时也介绍了如何编译带有调试信息的 FFmpeg。有缘再见,see you.


退出移动版