用VsDebug断点调试FFmpeg—FFmpeg调试环境搭建
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
《用msys2与mingw编译FFmpeg》《用msys2与msvc编译FFmpeg》 ,前面两篇文章已经讲解了如何在 windows 编译出 ffmpeg.exe 文件。
在 Windows 平台有没类似 gdb 调试工具可以断点调试可执行文件呢?
Windows 平台主要有两款调试工具。
1,VsDebug,集成在 vs2019 里面的调试器。vs 系列都是用的 VsDebug。
2,WinDbg,Windows诞生之初的第一款功能全面的调试器,目前依然应用广泛。例如 qt creator 的 MSVC 环境调试就是用的 WinDbg。
VsDebug 是 vs2019 的调试器,架构图如下:
上图中 devenv.exe 就是 vs2019 的界面程序。
用 vs2019 打开一个简单的 C 程序项目,例如之前的 hello.exe ,点击菜单栏的调试按钮,再查看相关的进程,就会看到 msvsmon.exe 进程,这个进程只有开启调试才会出现,编辑代码不会出现。
上图为什么叫 Remote Debugger ,因为 VsDebug 最初是为远程调试设计的,所以VS 中一直把他称为远程调试器。
下面就用 vs2019 来调试一下之前 编译出来的 ffmpeg.exe
,用的是 msvc
编译出来的 ffmpeg.exe
。没用 mingw
的 ffmpeg.exe
是因为他依赖一些外部库,操作会比较麻烦。
提醒:编译成功之后千万不要删除或者移动 FFmpeg-n4.4.1 源码目录,因为符号对应的源代码位置写进去了。移动了目录会导致调试的时候就会找不到源代码。
现在用 vs2019 打开文件夹 ffmpeg\build64\ffmepg-4.4-msvc
,如下:
由于我在 configure
的时候没有指定 SDL.dll
的位置,所以 ffplay.exe 没有编译出来,这个读者自行探索。
上面的流程,我只是用 vs2019 打开了一个文件夹,没有创建 解决方案 (solution),这是因为 在 Visual Studio 2017 及更高版本中 ,可以不创建解决方案,直接调试 exe
文件。
不创建解决方案直接调试 exe
,依赖两个文件,如下:
1,tasks.vs.json
,这个文件 类似 clion 的 Makefile Target,就是 make ,make install,make clean。本文是在 msys2 命令行手动编译 ffmpeg 的,所以不用配置 tasks.vs.json。详情请看《tasks.vs.json 架构参考》
2,launch.vs.json
,这个文件 类似 clion 的 Makefile Application,配置要调试的可执行文件,参数之类的,这个文件是本文重点。
如何创建 launch.vs.json
文件呢?首先,右边点击 ffmpeg.exe 文件,就会显示 "Debug and Launch Setting",如下
因为是 MSVC 编译的 ffmpeg ,所以选择 Native 原生的方式,如下:
这样 launch.vs.json
就创建完成了,这个文件是在 .vs 隐藏目录下的,如下:
再 把 ffmpeg.exe 设置为启动调试选项,如下:
然后,菜单栏的绿色按钮就可以点击了。如下:
现在调试 ffmpeg.exe 只会一闪而过,因为没有指定命令行参数,所以需要修改一下 launch.vs.json,内容如下:
{
"version": "0.2.1",
"defaults": {},
"configurations": [
{
"type": "native",
"name": "ffmpeg.exe help",
"project": "bin\\ffmpeg.exe",
"args": [ "--help" ]
},
{
"type": "native",
"name": "ffmpeg.exe mux",
"project": "bin\\ffmpeg.exe",
"args": [ "-i C:\\msys64\\home\\loken\\ffmpeg\\build64\\ffmepg-4.4-msvc\\walking-dead.mp4 -c copy C:\\msys64\\home\\loken\\ffmpeg\\build64\\ffmepg-4.4-msvc\\walking-dead.flv -y" ]
}
]
}
如上,我创建了两个调试选项,一个是 打印 help信息,一个是转码 walking-dead.mp4
,这个 mp4 文件请下载放到 ffmepg-4.4-msvc
目录下面。
更多 launch.vs.json
参数请查看微软的文档《launch.vs.json 架构参考》。
上面的配置,因为 windows 的编解码跟 Linux 有点不一样,要指定一些具体的采样率信息,所以我直接 -c copy 不解码了。
配置之后,可以看到,菜单栏有两个调试选项可以选择,如下:
咱们现在选择 ffmpeg.exe mux 来进行调试。如果直接点击 绿色三角按钮,会直接运行完毕,默认是没有断点的,所以我们需要先添加一个断点。
添加断点其实 跟 gdb 的 b main 差不多。点击菜单栏 的 Debug → Windows → Breakpoits ,即可添加断点。如下:
现在再点绿色三角符号,就可以直接停在 main 函数里面,如下:
现在,你可以在 ffmpeg.c
的源文件的具体行数打断点,方便调试。
由于我们没有在 vs2019 建立解决方案,是直接用 VsDebug 来调试,所以代码函数没有高亮,变量右侧也没有实时提示,只有底部一个 watch 区域可能看到变量数据。
跟之前在 ubuntu18 clion 的环境有点差距,clion
里面变量右侧是有实时信息的。如下:
vs2019 其实也是可以建立解决方案,github 有个开源项目 ShiftMediaProject。VsDebug 跟 watch 在一般情况够用。
vs2019 也可以直接 调 VsDebug 直接附加到现有进程上进行调试,跟 GDB 附加进程一样。
点击 Debug → Attach to Process, 如下:
参考资料:
感谢 NETINT(镕铭微电子) 赞助《FFmpeg原理》免费版一书的服务器费用,下面是 VPU 产品介绍