導入
Eigenは、優秀な行列計算のためのライブラリです。
Eigenはとても便利ですが、GDBなどのデバッガを使ってデバッグしようとすると、厄介なことになります。以下は、EigenのVectorXd型の変数、eigenvaluesの中身をデバッガ(GDB)で見てみた時の中身です。

とてもベクトルを表した変数だとは思えません。今回は、これを正しく表示できるようにしていきます。
環境
Windows上でVisual Studio Codeを使用し、デバッガはVSCode上でGUIのものを利用して見ることを想定します。また、記事の後半でCMakeToolsを使ったデバッグのときの設定も記します。
デバッガとして、GDBかmsvcを用いることとします。
1. GDB・MSVCの共通の準備
ダウンロードしたEigenのフォルダの中に、eigen-x.x.x/debug/というフォルダがあると思います。この中にgdbというフォルダとmsvcというフォルダがあるので、このうちのいずれかを利用します。vcpkgなどを利用してEigenを利用している場合は、Eigenのフォルダの中にdebugフォルダはないと思うので、自分でダウンロードしましょう。
また、CMakeToolsを使わない場合は、あらかじめlaunch.jsonの設定を済ませておき、デバッグ自体は行えるようにしておきましょう。
次の章では、GDBを用いた場合のやり方について書きます。
MSVCを用いたやり方は、「3. MSVCを用いた場合」をご覧ください。
2. GDBの場合
以下は、GDBを利用した場合のやり方です。
まず、先ほどの/debug/gdbフォルダを適当な場所に配置します。そのままの場所でも構いません。
次に、適当な場所に.gdbinitという名前のファイルを作成します。これはGDBの起動時の初期化のためのファイルであり、通常、グローバルな設定を書いたものをホームディレクトリに、そうでない設定を書いたものはプロジェクトのディレクトリに置いたりするそうです。今回は、プロジェクトのディレクトリの一番上に置くことにしましょう。ファイルの中身は以下のようにしておきます。
python
import sys
sys.path.insert(0, "eigen-x.x.x/debug/gdbへの絶対パス")
from printers import register_eigen_printers
register_eigen_printers(None)
end
ちなみに、この内容はeigen-x.x.x/debug/gdb/printers.pyのファイル冒頭のコメントに記されています。
2.1 (CMakeToolsを用いない場合)
launch.jsonの中身を書き換えます。launch.jsonの"configurations"に、"setupCommands"を追記し、以下のようにします。
{
"configurations":[
{
"name": "hoge",
"type": "cppdbg",
"中略":"中略",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
},
{
"description": "Load .gdbinit",
"text": "source ${workspaceFolder}/.gdbinit",
"ignoreFailures": false
}
]
}
]
}
以上で設定は終わりです。
2.2 (CMakeToolsを用いる場合)
launch.jsonの代わりに、setting.jsonを変更します。まだ作っていない場合は、.vscodeフォルダ内に新しく作成してください。
内容は以下の通りです。
{
"cmake.debugConfig": {
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": false
},
{
"description": "Load .gdbinit",
"text": "source ${workspaceFolder}/.gdbinit",
"ignoreFailures": false
}
]
}
}
ここに書いてある内容は、2.1で書いたものとほとんど同じです。
3 MSVCを用いた場合
MSVCを用いる場合では、debug/msvcフォルダにあるeigen.natvisファイルを使用します。
そのままの場所でも構いませんし、適当なフォルダにコピーしても大丈夫です。
CMakeToolsを用いない場合は、launch.jsonを以下のように書き換えます。
{
"configurations":[
{
"name": "hoge",
"type": "cppdbg",
"========":"========",
"中略":"中略",
"========":"========",
"visualizerFile": "eigen.natvisへのパス"
}
]
}
CMakeToolsを使わない場合の設定はこれで完了です。
CMakeToolsを用いる場合は、.vscode/settings.jsonを作成し、settings.jsonを以下のように書き換えます。
{
"cmake.debugConfig": {
"visualizerFile": "eigen.natvisへのパス"
}
}
これで設定は完了です。
4. 表示結果(共通)
行列の場合でも、以下のようにすべての成分を示すことができます。

いかがでしたか?
もっと洗練させた設定もできるかもしれませんが、これ以上は分かりませんでした!
Eigen以外でも、良い感じに表示したいものがあれば、自分でprinters.pyや.natvisのファイルを作ることもできるらしいので、試してみてください!
