Linux下搭建FFmpeg開發調試環境


背景

如果你是一個FFmpeg的使用者,那么絕大部分情況下只需要在你的程序中引用FFmpeg的libav*相關的頭文件,然后在編譯階段鏈接相關的庫即可。但是如果你想調試FFmpeg內部相關的邏輯,或者分析FFmpeg源碼,那么有一個可供單步調試FFmpeg的環境往往能使你事半功倍。

步驟

本文將介紹如何在Linux下(以Ubuntu 18.04 LTS為例)通過FFmpeg源碼(以4.4版本為例)編譯出一個相對簡潔的FFmpeg可執行程序,並通過gdb或者VS Code對其進行單點調試。

獲取源碼

首先從FFmpeg的官方github獲取對應的源碼:

https://github.com/FFmpeg/FFmpeg

本文將以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_gffprobe_g2個文件,這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++的步驟非本文重點,網上有很多教程,請自行搜索學習。



歡迎關注我的公眾號^^


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM