使用gdb远程调试ffmpeg

作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音

有时候ffmpeg命令是运行在一些比较低端的设备上的,仅仅运行ffmpeg进程就已经占用了大部分的资源,无法再开启 gdb 来调试。这种情况下我们通常会用到远程调试

本文主要介绍 gdb 如何远程调试 ffmpeg,首先你需要有两台 Linux 电脑,电脑 A 运行 ffmpeg 进程,电脑B 启动 gdb 来进行远程调试。

我的电脑 A 是 Ubuntu 22.04.4 版本,我的电脑 B 也是 Ubuntu 22.04.4 版本。

但是我这里没有使用交叉编译,因为我两台电脑的CPU架构都是一样的。我是直接在电脑 B 编译出来 ffmpeg 的所有二进制文件,然后把整个 FFmpeg-n4.4.1 文件夹传输到电脑 A,因为电脑 A 不需要实际运行 ffmpeg 进程,他只需要有 ffmpeg 的源代码 与 调试符号 就行,而这些东西全部都在 FFmpeg-n4.4.1 文件夹里面。

1-1


在电脑 B ,我们需要通过 gdbserver 来启动 ffmpeg 进程,命令如下:

cd ~/Documents/FFmpeg-n4.4.1
gdbserver 192.168.0.108:1239 ./ffmpeg_g

1-2

gdbserver 命令启动之后,电脑 B 就会启动一个 TCP 服务,监听在 1239 端口,等待 电脑 A 来连接。这时候 ffmpeg 进程已经启动了,但是还没有进入 main 函数,被 gdbmain 的前面设置了断点。


现在我们可以用 电脑 A 去连接 电脑 B 了,命令如下:

cd ~/Documents/FFmpeg-n4.4.1
# 加载调试符号
gdb ./ffmpeg_g
# 连接 gdbserver
target remote 192.168.0.108:1239

1-3

其实现在我们已经远程 attach 进去 电脑 B 的 ffmpeg 进程的了,我们可以输入一下 bt 命令查看一下函数的调用栈,如下:

1-4

可以看到,现在 ffmpeg 进程停在了系统库的函数里面,因为系统库没有调试符号,所以没有显示出来函数名称,不过你是可以自己下载 系统库的调试符号的,如果你需要调试操作系统内核的话,推荐阅读《软件调试》- 张银奎


连接 gdbserver 成功之后,我们就可以设置断点了,命令如下:

b main

然后在电脑 A 的窗口输入 continue 命令,即可让电脑 B 的 srs 进程继续运行起来,如下:

continue
# 查看源码窗口
layout src

可以看到,已经断点进去 mian 函数了。

1-5

版权所属 xianwanzhiyin.net 罗上文 2024 all right reserved,powered by Gitbook该文件修订时间: 2024-04-23 15:01:35

results matching ""

    No results matching ""