web-dev-qa-db-ja.com

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

これを達成する方法はありますか?

82
Paolo Tedesco

少なくともソースが最適化されている場合などは、そうではないと思います。しかし、STBコンテナを検査できるgdbのマクロがいくつかあります。

http://sourceware.org/ml/gdb/2008-02/msg00064.html

しかし、私はこれを使用しないので、YMMV

32
jpalecek

この質問に対する既存の回答は、very古くなっています。最近のGCCおよびGDBを使用すると、正常に機能しますTM GDB 7.xの組み込みのPythonサポート、およびGCCに付属のlibstdc ++プリティプリンタのおかげです。

OPの例では、次のようになります。

(gdb) print m
$1 = std::map with 2 elements = {[1] = 2, [2] = 4}

自動的に機能しない場合は、GDB wikiの STLサポート ページに最初の箇条書きが表示されます。

Python独自のタイプのプリティプリンターも記述できます。GDBマニュアルの Pretty Printing を参照してください。

81
Jonathan Wakely

常に明らかなことがあります:独自のテスト関数を定義します... 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) 
22
Mr.Ree

stl-views.gdbは、以前はベストアンサーでしたが、それ以上ではありませんでした。

これはまだメインラインGDBに統合されていませんが、「archer-tromey-python」 branch を使用して得られるものは次のとおりです。

(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
20

STLコンテナの逆参照を試してください:このページ: http://www.yolinux.com/TUTORIALS/GDB-Commands.html

12
anand

2番目の問題(Cannot evaluate function -- may be inlined)プログラムをコンパイルするときに、コンパイラがDWARF-2(または3または4)デバッグ情報を使用することを確認します。 DWARF-2にはインライン化情報が含まれているため、説明したいずれかの方法を使用して、std::mapコンテナ。

DWARF-2デバッグ情報を使用してコンパイルするには、-gdwarf-2コンパイルコマンドへのフラグ。

0
Dan

上記の答えはうまく機能しています。 stl-views.gdbを使用している場合、ここにマップとその中の要素を表示する適切な方法があります。マップを次のようにします:std::map<char, int> myMap;

(gdb) pmap myMap char int

すなわちpmap <variable_name> <left_element_type> <right_element_type>マップ内の要素を表示します。

お役に立てば幸いです。

0
Mazhar MIK