背景
如果你是一個FFmpeg的使用者,那么絕大部分情況下只需要在你的程序中引用FFmpeg的libav*
相關的頭文件,然后在編譯階段鏈接相關的庫即可。但是如果你想調試FFmpeg內部相關的邏輯,或者分析FFmpeg源碼,那么有一個可供單步調試FFmpeg的環境往往能使你事半功倍。
步驟
本文將介紹如何在Linux下(以Ubuntu 18.04 LTS為例)通過FFmpeg源碼(以4.4版本為例)編譯出一個相對簡潔的FFmpeg可執行程序,並通過gdb
或者VS Code
對其進行單點調試。
獲取源碼
首先從FFmpeg的官方github獲取對應的源碼:
本文將以release/4.4
分支版本的源碼為例:
git clone https://github.com/FFmpeg/FFmpeg.git -b 4.4/release
編譯
如上文所說,既然是要編譯FFmpeg的相對簡潔的版本,就意味着編譯出來的庫的功能並非大而全,本文也僅僅是為了演示如何編譯與調試FFmpeg,不希望有太多額外的庫依賴步驟(以免擾亂初學者的學習節奏)。
若有需要調試額外的功能(如x264),只需要在編譯FFmpeg的時候打開對應的功能(如 --enable-x264
)再重新編譯即可,本文不做贅述。
和Linux下絕大多數編譯步驟一樣,先執行./configure
來配置項目;在執行FFmpeg的./configure
的時候記得打開調試選項--enable-debug
以保留調試符號,方便我們后續調試:
cd FFmpeg
./configure --disable-shared --enable-static --disable-asm --enable-debug
make
# ☕ 編譯相對耗時,請耐心等待..
好了,經過漫長的編譯等待過程,我們可以看到當前目錄下有多了ffmpeg_g
和ffprobe_g
2個文件,這2個結尾帶_g
的便是攜帶了編譯符號可調試的可執行文件。
調試
我們以最簡單的查看ffmpeg版本的命令為例:
./ffmpeg_g -version
來分別介紹如何使用gdb或者VS Code對程序進行單步調試。
使用gdb調試ffmpeg
首先運行gdb
,指定調試程序:
gdb ./ffmpeg_g
好了,接下來的命令都是在gdb的交互中進行。
先設置運行參數為-version
:
set args -version
將斷點打在main
函數入口處:
b main
設置顯示源碼布局:
layout src
開始運行程序:
run
此時遇到斷點main
會自動停下:
關於gdb的相關操作不是本文的重點,請自行搜索學習,如果本文不做贅述。
如果希望能夠更方便地在gdb調試過程中參照源碼,可以嘗試使用
cgdb
這個工具,它其實就是基於gdb
包裝多了一層命令行可視化交互界面,方便在調試過程中邊看源碼邊調試,詳情可以查看本號的文章:cgdb | 一起邊看源碼邊調試gdb吧
使用VS Code調試ffmpeg
如今的VS Code經過多個版本的迭代,已經不僅僅是一個簡單的編輯器,開發者通過各個強大的插件可以把它打造成一個類IDE的工具。
在Ubuntu的環境下你可以通過直接安裝Linux版本的VS Code來使用,當然你也可以在其他系統上安裝好VS Code然后通過Remote - SSH插件來遠程打開你的源碼工程。
言歸正傳,要使用VS Code來調試C/C++項目,需要至少先安裝如下2個VS Code插件:
- C/C++
- C/C++ Runner
首先,你需要在VS Code中打開你的ffmpeg目錄。
然后在VS Code中同時按下Ctrl + Shift + P打開輸入"launch.json",選擇Open 'launch.json' 來打開調試的啟動配置文件,主要修改以下關鍵地方:
// 把要調試的程序路徑填好:
"program": "${fileDirname}/../ffmpeg_g",
// 運行參數為 -version:
"args": ["-version"],
注釋掉"preLaunchTask"一行,因為我們已經編譯過了,也不想使用它默認的編譯步驟
// "preLaunchTask": "C/C++: gcc 生成活動文件",
總體的配置如下,修改完記得保存文件:
{
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和調試活動文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/../ffmpeg_g",
"args": ["-version"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// "preLaunchTask": "C/C++: gcc 生成活動文件",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
好了,此時你可以打開想要調試的文件,以本次要調試的ffmpeg_g
為例,打開ffmpeg.c
文件,然后把鼠標挪到行號的左邊會出現一個淡淡的小紅點,點下之后會顯示紅點,代表你在本行打了一個斷點。
此時按下F5
鍵,會啟動調試模式,並把斷點停留在你打的斷點處:
你可以點擊上方的工具欄來執行相關調試操作,也可以使用快捷鍵來進行操作:
F5
:繼續執行F10
:單步跳過F11
:單步調試Shift + F11
:單步跳出Shift + F5
:停止調試
左邊的DEBUG工具欄可以讓你輕松地查看本地變量和寄存器,可以添加相關的變量監視,也可以查看函數的調用堆棧等信息。
關於VS Code調試C/C++的步驟非本文重點,網上有很多教程,請自行搜索學習。
歡迎關注我的公眾號^^