GDBでEigenをきれいに表示する
言わずもがな、GDBはC++プログラミングなどにおいて必須なデバッガツールである。
デフォルトの設定だと、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/printers
はeigen/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}
やや見やすくなったかな?