gdbを使用して標準コンテナ(std :: map)の内容を検査する
質問
次のようなものがあるとします:
#include <map>
int main(){
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0;
}
gdbからプログラムを実行しているマップの内容を検査できるようにしたい。
添字演算子を使用しようとすると、次のようになります:
(gdb) p m[1]
Attempt to take address of value not located in memory.
findメソッドを使用しても、より良い結果は得られません。
(gdb) p m.find(1)
Cannot evaluate function -- may be inlined
これを達成する方法はありますか?
解決
ない、少なくともソースが最適化されている場合などはないと思う
http://sourceware.org/ml/gdb/2008-02/ msg00064.html
ただし、これは使用しないので、YMMV
他のヒント
常に明らかなことがあります:独自のテスト関数を定義します... gdbから呼び出します。例:
#define SHOW(X) cout << # X " = " << (X) << endl
void testPrint( map<int,int> & m, int i )
{
SHOW( m[i] );
SHOW( m.find(i)->first );
}
int
main()
{
std::map<int,int> m;
m[1] = 2;
m[2] = 4;
return 0; // Line 15.
}
そして:
....
Breakpoint 1 at 0x400e08: file foo.C, line 15.
(gdb) run
Starting program: /tmp/z/qD
Breakpoint 1, main () at qD.C:15
(gdb) call testPrint( m, 2)
m[i] = 4
(*m.find(i)).first = 2
(gdb)
以前はstl-views.gdb
がベストアンサーでしたが、もうありませんでした。
これはまだメインラインGDB
に統合されていませんが、「archer-tromey-python」ブランチ:
(gdb) list
1 #include <map>
2 int main(){
3 std::map<int,int> m;
4 m[1] = 2;
5 m[2] = 4;
6 return 0;
7 }
(gdb) break 6
Breakpoint 1 at 0x8048274: file map.cc, line 6.
(gdb) run
Breakpoint 1, main () at map.cc:6
6 return 0;
(gdb) print m
$1 = std::map with 2 elements = {
[1] = 2,
[2] = 4
}
(gdb) quit
STFコンテナの逆参照を試してください:このページ: http://www.yolinux .com / TUTORIALS / GDB-Commands.html
2番目の問題(Cannot evaluate function -- may be inlined
)を回避するには、プログラムのコンパイル時にコンパイラがDWARF-2(または3または4)デバッグ情報を使用するようにします。 DWARF-2にはインライン化情報が含まれているため、説明した方法のいずれかを使用してstd::map
コンテナの要素にアクセスできる必要があります。
DWARF-2デバッグ情報でコンパイルするには、コンパイルコマンドに-gdwarf-2
フラグを追加します。
上記の答えはうまく機能しています。 stl-views.gdbを使用している場合、ここにマップとその中の要素を表示する適切な方法があります。
マップを次のようにします。
std::map<char, int> myMap;
(gdb) pmap myMap char int
i.e。 pmap <variable_name> <left_element_type> <right_element_type>
マップ内の要素を表示します。
役立つこと。