102

次のようなものがあるとします。

#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

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

4

7 に答える 7

107

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

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

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

自動的に機能しない場合は、GDB wiki のSTL サポートページの最初の箇条書きを参照してください。

独自の型に対して Python プリティ プリンタを作成することもできます。GDB マニュアルのプリティ プリンティングを参照してください。

于 2013-03-11T00:26:00.840 に答える
36

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

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

ただ、これは使わないのでYMMV

于 2009-01-09T10:31:00.790 に答える
25

明らかなことは常にあります。独自のテスト関数を定義してください... 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) 
于 2009-01-10T00:10:33.840 に答える
21

以前は最高の答えでしたが、今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
于 2009-01-11T22:52:36.307 に答える
12

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

于 2009-01-09T11:57:57.283 に答える
-1

2 番目の問題 ( Cannot evaluate function -- may be inlined) は、プログラムをコンパイルするときにコンパイラが DWARF-2 (または 3 または 4) のデバッグ情報を使用していることを確認することで回避できます。std::mapDWARF-2 にはインライン化情報が含まれているため、説明したメソッドのいずれかを使用してコンテナーの要素にアクセスできるはずです。

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

于 2013-02-03T21:37:21.427 に答える