gdbでvectorなどの中身をprintする


このエントリーをはてなブックマークに追加

gdbvectorなどSTLのコンテナの中身をprintしようとすると、例えば以下のようにうまく表示できません。

(gdb) p x1
$1 = {<std::_Vector_base<int, std::allocator<int> >> = {
    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>},
<No data fields>}, _M_start = 0x8003b9e8,
      _M_finish = 0x8003b9fc, _M_end_of_storage = 0x8003b9fc}}, <No data fields>}

中身をうまくprintする方法がSTLSupport - GDB Wikiに載っています。ここでその方法を簡単に紹介します。gdb 7以降でないとできないそうなので注意。

  1. 適当な場所で svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python する
    • ここでは、/home/(ユーザ名)/scripts/gdb_printers/にcdした後上記コマンドを打ったものとします。
  2. ~/.gdbinitに以下のようなファイルを作成する。パス名は適宜書き換えてください。
python
import sys
sys.path.insert(0, '/home/(ユーザ名)/scripts/gdb_printers/python')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

正しく設定ができると、以下のように読みやすい表示が得られます。

(gdb) p x1
$1 = std::vector of length 5, capacity 5 = {1, 1, 4, 9, 10}

参考リンク