しゃけのブログ

某大学院で研究している人の備忘録

GDBでEigenをきれいに表示する

言わずもがな、GDBC++プログラミングなどにおいて必須なデバッガツールである。

デフォルトの設定だと、EigenのMatrixの中身が生データで表示されていて、ColMajarなどになっていると見づらい。

$11 = (const Eigen::Matrix<double, 3, 6, 0, 3, 6> &) @0x7f65a67fab30: {<Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 6, 0, 3, 6> >> = {<Eigen::MatrixBase<Eigen::Matrix<double, 3, 6, 0, 3, 6> >> = {<Eigen::DenseBase<Eigen::Matrix<double, 3, 6, 0, 3, 6> >> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 3, 6, 0, 3, 6>, 3>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 3, 6, 0, 3, 6>, 1>> = {<Eigen::DenseCoeffsBase<Eigen::Matrix<double, 3, 6, 0, 3, 6>, 0>> = {<Eigen::EigenBase<Eigen::Matrix<double, 3, 6, 0, 3, 6> >> = {<No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, m_storage = {m_data = {array = {6.9206107951848877e-310, 4.9406564584124654e-324, 1.6798231958602383e-322, 
          6.9205842353398654e-310, 6.9206028846373822e-310, 6.9206028846381727e-310, -0.012499007761522431, -0.012499007761522431, 
          0.99992188435146145, 0.99992188435146145, 1, 0.99992188435146145, 0, 0, 1.3041326032698003e-18, 8.5038092345563313e-37, 1e-10, 
          0}}}}, <No data fields>}

Eigen公式が出しているフォーマッタをGDBに読み込ませることできれいな表示が可能になるらしいので試してみた。

Setup

次のファイルが本体で、これを読み込ませるようなスクリプトgdbが読み込む設定ファイルに書き込む。

https://gitlab.com/libeigen/eigen/-/blob/master/debug/gdb/printers.py

GDBは~/.gdbinitを読み込むらしいので、上のpythonコードに書いてあるように次のように書き込む。

python
import sys
sys.path.insert(0, '/path/to/eigen/printers')
from printers import register_eigen_printers
register_eigen_printers(None)
end

ここで/path/to/eigen/printerseigen/debug/gdbになる。

※ Eigenをapt-getなどでインストールした人の環境にはeigen/debug/gdbが存在しないので、上のリポジトリをダウンロードして適当な場所において、そのパスを設定する。

結果

次回以降のGDBでEigen Matrixの変数を表示したときは次のようになる。

$1 = Eigen::Matrix<double,3,6,ColMajor> (data ptr: 0x7f32463e5b30) = {[0,0] = 6.9097051814122555e-310, [1,0] = 4.9406564584124654e-324, 
  [2,0] = 1.6798231958602383e-322, [0,1] = 6.9096857975822047e-310, [1,1] = 6.9097009197853916e-310, [2,1] = 6.9097009197861821e-310, 
  [0,2] = -0.012499007761522431, [1,2] = -0.012499007761522431, [2,2] = 0.99992188435146145, [0,3] = 0.99992188435146145, [1,3] = 1, 
  [2,3] = 0.99992188435146145, [0,4] = 0, [1,4] = 0, [2,4] = 1.3041326032698003e-18, [0,5] = 8.5038092345563313e-37, [1,5] = 1e-10, [2,5] = 0}

やや見やすくなったかな?