Windows + Visual Studio 2019 で EDK2 の OVMF をビルドする【4.WinDBGでデバッグ】

#【目標】
『Windows 10 に EDK2環境 を構築し、Visual Studio Community 2019 を
　使って OVMF(OvmfPkg) をビルドする。』
の続きとして『WinDBGでデバッグ』してみます。


#【前回まで】
前回でEDK2環境の構築が完了し、64bit版OVMF(OvmfPkg)のビルドができました。
またQEMUでの動作確認もできました。
目標は前回で達成しましたが、せっかくOVMFがビルドできたのですから、
デバッグ環境が整えばもっといいと思いますよね。


#【今回の目標】
WinDBGを使ってQEMU上の64bit版OVMF(OvmfPkg)をデバッグ(デバッガー接続)
します。
https://github.com/tianocore/tianocore.github.io/wiki/How-to-debug-OVMF-with-QEMU-using-WinDbg
How to debug OVMF with QEMU using WinDbg
ほぼこちらの内容となっています。


#【はじめに】
・前回ビルドした64bit版OVMF(OvmfPkg)ではデバッガー設定が有効になって
　おらず、デバッガーとの接続ができません。
　デバッガー設定を有効とした64bit版OVMF(OvmfPkg)をビルドします。
・WinDBGはWindows SDKに含まれていますが、今までの手順では有効化
　されていません。
　WinDBGを有効化します。
・WinDBGだけでもデバッガー接続はできませんので、Intelより提供されて
　いる「Intel® UEFI Development Kit Debugger Tool」も
　インストールします
・TeraTermもインストールして、QEMUモニタなども動かしてみます。
・QEMUそのものは設定変更する必要はありませんが、起動する仮想PC側の
　パラメータ変更が必要となります。


それではデバッガー設定を有効にする64bit版OVMF(OvmfPkg)をビルド
しましょう。

#【EDK2ビルド用コマンドプロンプト】
・スタートメニューより<B>「x64 Native Tools Command Prompt for VS 2019」</B>を
　開いて、次の通り入力します

```TXT:EDK2ビルド用コマンドプロンプト
　chcp 65001
　cd C:\EDK2
　edksetup.bat
```

　※使用する文字コードをUTF-8にして以降の日本語文字化けに対処します。
　※以下の1つのエラーは気にしないでください
　　- 「!!! ERROR !!! Binary C tools are missing. They are required to be built from BaseTools Source.」
　　　BaseToolsでsplit.exeを生成しなくなったのにチェックしているようです
　※以下の2つのワーニングが出ますが気にしないでください
　　- 「!!! WARNING !!! CLANG_BIN environment variable is not set」
　　　今後も CLANG は使わないので設定しません
　　- 「!!! WARNING !!! No CYGWIN_HOME set, gcc build may not be used !!!」
　　　今後も CYGWIN は使わないので設定しません
・<B>そのまま【デバッガー設定を有効にする64bit版OVMF(OvmfPkg)のビルド】
　へすすみます</B>
・https://github.com/tianocore/tianocore.github.io/wiki/Windows-systems
　「Build」に記載の手順となります


#【デバッガー設定を有効にする64bit版OVMF(OvmfPkg)のビルド】
・引き続き<B>「x64 Native Tools Command Prompt for VS 2019」</B>で
　次の通り入力します

```TXT:デバッガー設定を有効にする64bit版OVMF(OvmfPkg)のビルド
　build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -t VS2019 -b NOOPT -D SOURCE_DEBUG_ENABLE=TRUE -D DEBUG_ON_SERIAL_PORT
```

・前回との違いは3つあります。
　- デバッグ(DEBUG)版ではなく、最適化なし(NOOPT)版です
　- ソースコードデバッグを有効にしています
　- デバッグシリアルポートを有効にしています
・<B>"Done" が出たらビルドは終了です</B>
・以下のように入力して <B>OVMF.fd が出来ていたら成功</B>です
　<B>dir C:\edk2\Build\OvmfX64\NOOPT_VS2019\FV\OVMF.fd</B>


次に、WinDBGを有効化しましょう。

#【WinDBGの有効化】
・WinDBGはWindows SDKのコンポーネントとして提供されています
・前回までのVisual Studio Community 2019のインストールによって
　Windows SDKはインストールされていますが、WinDBGはデフォルト
　では有効になっていませんでした。
・以下の手順でWindows SDKの設定を変更してWinDBGを有効にします。
　- Windowsの設定からアプリを開きます
　- アプリと機能の一覧にある
　　<B>「Windows Software Development Kit - Windows 10.0.19041.685」</B>
　　で<B>[変更]</B>をクリックします
　　![WinDBG画像0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1491958/5a30ee32-f2f5-dc80-8a81-746b00ffd99a.png)
　- <B>「Maintain for your Windows Software Development Kit (略)」</B>
　　では<B>「Change」を選択</B>して[Next]をクリックします
　　![WinDBG画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1491958/675a1f69-342f-4022-09b0-7189cd0eb3f9.png)
　- <B>「Select the features you want to change」</B>では
　　<B>「Debugging tools for Windows」にチェック</B>を付けて
　　[Change]をクリックします
　　![WinDBG画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1491958/7484e679-9902-2590-0ec7-0b5dc4a60bca.png)
・Windows SDKの設定変更が終わると、WinDBGが有効になっています


引き続き、Intel® UEFI Development Kit Debugger Tool を
インストールしましょう。

#【Intel® UEFI Development Kit Debugger Tool のインストール】
・Intel® UEFI Development Kit Debugger Tool はこちらから
　ダウンロードしてインストールします。
　https://software.intel.com/content/www/us/en/develop/download/intel-uefi-development-kit-intel-udk-debugger-tool-r150-windows.html
・ダウンロードした udk-debugger-tool-v1-5-win.zip には
　インストーラー、リリースノート、マニュアルが含まれて
　いますので、インストーラーを実行してください。
・Intel® UEFI Development Kit Debugger Toolのインストール
　際に設定が必要となるのは以下の3箇所です。
　- 「Windows Debugger Folder」では、インストーラーが
　　WinDBGの格納フォルダを見つけられないので指定します
　　"C:\Program Files (x86)\Windows Kits\10\Debuggers\x86"
　　にあると思います
　　![UEFI Debbuger画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1491958/6ad8aa5a-f4b6-8687-9db0-d0447c15c1e2.png)
　- 「Configure Debug Port」では、接続方法で TCP接続 を設定します
　　Debug Port Channel : TCP
　　Server : localhost
　　Port : 20716
　　![UEFI Debbuger画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1491958/e89718e8-0ae7-1647-1850-947cefbf8aaf.png)
　- UEFIデバッグ用ドライバのインストールが必要です
　　![UEFI Debbuger画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1491958/d86ab7bf-a81e-9055-6246-51b8fec422d1.png)


引き続き、TeraTerm をインストールしましょう。

#【TeraTerm のインストール】
・TeraTermについてはこちらを参照してください
　https://ttssh2.osdn.jp/
・TeraTerm にはインストーラーもあるのですが、ZIP版も
　ありましたのでZIP版を使用します
　こちらのサイトからZIP版をダウンロードしてください。
　https://ja.osdn.net/projects/ttssh2/releases/
・teraterm-4.106.zip をダウンロードして展開します
・展開先は C:\TeraTerm となるようにしてください
　C:\TeraTerm\ttermpro.exe があれば展開は成功です


最後に WinDBGでデバッグ してみましょう。

#【WinDBGでデバッグ】
・いきなりですが、テキストエディタを使用して以下のバッチファイルを
　C:\EDK2\DbgWin.cmd として作成してください
　※メモ帳で作成する場合は、保存する際の文字コードにご注意ください
　　ANSIで保存するのが良いと思います

```CMD:DbgWin.cmd
start "Monitor"  /B "C:\TeraTerm\ttermpro.exe" localhost:20717 /nossh
start "Debugger" /B "C:\Program Files (x86)\Intel\Intel(R) UEFI Development Kit Debugger Tool\eXdi.exe" /LaunchWinDbg
start "Console"  /B "C:\TeraTerm\ttermpro.exe" localhost:20715 /nossh

start "QEMU" /B "C:\Program Files\qemu\qemu-system-x86_64.exe" ^
  -machine q35,smm=on ^
  -m 8G  ^
  -smp 4  ^
  -global ICH9-LPC.disable_s3=1 ^
  -drive if=pflash,format=raw,unit=0,file=C:\edk2\Build\OvmfX64\NOOPT_VS2019\FV\OVMF_CODE.fd,readonly=on ^
  -drive if=pflash,format=raw,unit=1,file=C:\edk2\Build\OvmfX64\NOOPT_VS2019\FV\OVMF_VARS.fd ^
  -monitor tcp:localhost:20717,server ^
  -serial tcp:localhost:20716,server ^
  -net none
```

・作成したバッチファイルを実行する前に、
　<B>「Intel® UEFI Development Kit Debugger Tool」
　のデバッガー設定を1箇所だけ変更</B>します
　- スタートメニュー から <B>「Intel(R) UEFI Development 
　　Kit Debugger Tool」のプログラムグループにある
　　「Change Configurations」を開いてください</B>
　- メモ帳などでデバッガー設定が表示されますので、
　　1箇所だけ変更してください
　　<B>[Features]セクションの LoadModuleSymbol = 1 を
　　1 から 0 にします</B>
　- デバッガー設定を<B>保存して閉じてください</B>
　※この設定をしないと、OVMFの構成モジュールごとにシンボルの
　　ロードが行われるため、起動完了までに相当時間がかかって
　　しまいます
・それでは、作成した C:\EDK2\DbgWin.cmd をコマンドプロンプトで
　実行してみましょう
　※初回実行時に Windows Defender ファイアウォール 警告が
　　表示されましたら許可してください
・以下のウィンドウが表示されたのち、WinDBGのウィンドウで
　初期ブレークしていると思いますので、WinDBGでgコマンドを
　実行してください
　- TeraTerm で QEMUモニタ
　- TeraTerm で QEMUコンソール
　- Intel(R) UEFI Development Kit Debugger Tool コンソールウィンドウホスト
　- WinDBG
　- QEMU
・TeraTerm の QEMUコンソール に起動ログが出力されたのち、
　OVMFの起動が完了します
・具体的なデバッグ方法はWinDBGのコマンドを参照ください

以上の通り、WinDBGでデバッグができることが確認できました。
<BR>
「Windows + Visual Studio 2019 で EDK2 の OVMF をビルドする」
をテーマとした記事は以上をもって終了となります。
ありがとうございました。