用WinDbg断点调试FFmpeg

简介: 用WinDbg断点调试FFmpeg

本文主要讲解 WinDbg 调试器的使用。WinDbg 在 Windows 里面的地位,就跟 GDB 在 Linux 的地位一样。可以通过 微软的官方网站 下载 安装 WinDbg。

WinDbg 是比较轻量级的调试工具,在一些场景下比较实用,例如不方便安装 vs2019。

只要有 符号信息表(symbols) 跟 调试信息表(debug info),一样能用 WinDbg 进行 源码级调试 跟 各种断点调试。这些信息,windows 是放在 pdb 文件里面的,在源码目录,可以看到 ffmpeg_g.pdb 这个文件。

FFmpeg 的编译过程跟 前面文章 《用msys2与msvc编译FFmpeg 》一样的,都是使用 msys2 + msvc。请按照之前的教程编译出来 ffmpeg.exe 文件,如果已经编译出来就可以直接用之前的 ffmpeg.exe。

WinDbg 有 32 位跟64位,我们的 ffmpeg.exe 是 64 位的,所以选用 WinDbg 64位来调试。如下:



打开 windbg.exe ,界面如下:

然后点击 菜单栏的 File → Open Executable,会弹出窗口,如下:

上图中 设置了 Arguments 参数 跟工作目录,参数如下:

Arguments :-i walking-dead.mp4 -c copy walking-dead.flv -y

Start directory:C:\msys64\home\loken\ffmpeg\build64\ffmepg-4.4-msvc

walking-dead.mp4 是本书经常用到的视频素材,请下载保存好。

打开之后,界面如下:

这里简单讲解一些 WinDbg 的界面,底部是命令输入框,上图中,我输入了一个 k, 查看当前断点的调用栈。

可以看到,WinDbg 会默认停在 ntdll 模块 的 LdrpDoDebuggerBreak 函数,这是 WinDbg 的默认断点,现在还没有跑进去 ffmpeg.exe 的main函数,所以我们需要加一个断点,如下:

# 设置断点
bu ffmpeg_g!main
# 继续执行
g

注意,是 ffmpeg_g ,后面有个 _g 。 设置完断点之后,再敲入一个命令 g,g 代表 go。代码就会执行到 main 那里停下来。如下:

现在讲一下 WinDbg 常用的一些命令。

1,k :查看函数调用栈。

2,bu :根据符号进行断点,例如 bu ffmpeg_g.exe!main ,前面要有模块名,跟gdb 有点不一样。

3,bl:查看所有断点。

4,p:单步步进。

5,g:代码继续执行,go 的意思,快捷键 F5

WinDbg 的更多命令,请看 《微软WinDbg 文档》《WinDbg 调试器文档》


WinDbg 还有更多的调试窗口可以调出来,这些窗口都在菜单栏的 View 里面,这里简单介绍一下这些窗口。

1,Watch,观察窗口。点击可以添加自己想观察的全局变量或者局部变量。

2,Locals,局部变量窗口,运行到某个函数,这个窗口就是显示这个函数的局部变量信息。

3,Registers,寄存器窗口。

4,Memory,内存窗口。

4,Call Stack ,函数调用栈。

6,Disassembly,汇编代码窗口。

下面我把一些窗口调出来看看效果,如下:

调试器的功能都是类似的,常用的功能无非就是 数据断点,函数断点,然后可以观察变量之类的。

WinDbg 这个调试器的具体架构实现跟用法,墙裂推荐 《软件调试》卷二 windows 下册第30章 ,通过这本书,你可以了解到如何实现一个调试器。

参考资料:

1,《软件调试》卷二 windows 下册第30章 - 张银奎


目录
相关文章
|
监控 NoSQL
JLink + GDB 调试方法
本节主要介绍嵌入式开发中常用的JLink+GDB调试方法。 调试所需软件 J-link,可以从https://www.segger.com下载对应操作系统的软件包,然后安装(注意:segger是仿真器的名字,相当常用的一款,仿真器的接口也是固定的,一般开发版上都会带有这个调试接口,如图) 运行JLinkGDBServer 按照上图中的配置,配置GDBServer,然后点击OK,进入下一个界面 注意,如果硬件连接没有问题,那么上图中的J-Link和 Device栏中显示绿色,GDB显示为红色,因为我们还没有运行GDB软件。
6759 46
|
4月前
|
小程序 存储控制器 Android开发
OPENJTAG调试学习(二):OpenOCD、OpenJTAG 烧写程序、调试程序
OPENJTAG调试学习(二):OpenOCD、OpenJTAG 烧写程序、调试程序
196 0
|
11月前
|
NoSQL Linux 网络安全
【Linux C】GCC编译 && GDB调试 从入门到放弃 (gcc调试选项详解、gdb调试、条件断点、远程调试、脚本化调试)(二)
阅读本文可能需要一些基础,比如:C语言基础、Linux基础操作、vim、防火墙等。篇幅有限,本文讲的“比较浅显”。 通过本文你将学会: gcc编译 gdb调试
|
11月前
|
NoSQL IDE Linux
【Linux C】GCC编译 && GDB调试 从入门到放弃 (gcc调试选项详解、gdb调试、条件断点、远程调试、脚本化调试)(一)
阅读本文可能需要一些基础,比如:C语言基础、Linux基础操作、vim、防火墙等。篇幅有限,本文讲的“比较浅显”。 通过本文你将学会: gcc编译 gdb调试
|
编解码 NoSQL Linux
用VsDebug断点调试FFmpeg
用VsDebug断点调试FFmpeg
116 0
编译ffmpeg,ffplay运行出错怎么办?
编译ffmpeg,ffplay运行出错怎么办?
65 0
|
算法 关系型数据库 芯片
MDK 用Jlink调试无法使用断点
MDK 用Jlink调试无法使用断点
600 0
MDK 用Jlink调试无法使用断点
|
网络协议 开发工具 Windows
Windows平台的Windbg/x64dbg/OllyDbg/VisualGDB调试器简介以及符号文件*.pdb总结(1)(★firecat推荐★)
Windows平台的Windbg/x64dbg/OllyDbg/VisualGDB调试器简介以及符号文件*.pdb总结(★firecat推荐★)
427 0
Windows平台的Windbg/x64dbg/OllyDbg/VisualGDB调试器简介以及符号文件*.pdb总结(1)(★firecat推荐★)
|
iOS开发 开发者
配合LLDB调试器进行iOS代码调试(一)
配合LLDB调试器进行iOS代码调试
151 0
配合LLDB调试器进行iOS代码调试(一)
|
前端开发 rax 网络协议
配合LLDB调试器进行iOS代码调试(二)
配合LLDB调试器进行iOS代码调试
235 0