16

gdb で std::vector の内容を調べたいのですが、gcc ではなく icc を使用しているため、_M_impl にアクセスできません。どうすればよいですか? 簡単にするために、それが std::vector だとしましょう。

ここに非常に良い答えがありますが、icc を使用すると機能しません。エラー メッセージは「_M_impl という名前のメンバーまたはメソッドがありません」です。ここには優れたデバッグ ツールセットがあるようですが、_M_impl にも依存しています。

4

3 に答える 3

11

これがあなたのベクトルで機能するかどうかはわかりませんが、私にとっては機能しました。

#include <string>
#include <vector>

int main() {
    std::vector<std::string> vec;
    vec.push_back("Hello");
    vec.push_back("world");
    vec.push_back("!");
    return 0;
}

gdb:

(gdb) break source.cpp:8
(gdb) run
(gdb) p vec.begin()
$1 = {
   _M_current = 0x300340
}
(gdb) p $1._M_current->c_str()
$2 = 0x3002fc "Hello"
(gdb) p $1._M_current +1
$3 = (string *) 0x300344
(gdb) p $3->c_str()
$4 = 0x30032c "world"
于 2008-11-26T23:49:21.650 に答える
4

通常、デバッガーでコンテナー クラスを扱うときは、要素への参照をローカル変数として作成します。これにより、コンテナーの実装をいじることなく、デバッガーで簡単に確認できます。

これは不自然な例です。

vector<WeirdStructure>  myWeird;

/* push back a lot of stuff into the vector */ 

size_t z;
for (z = 0; z < myWeird.size(); z++)
{
    WeirdStructure& weird = myWeird[z];

    /* at this point weird is directly observable by the debugger */ 

    /* your code to manipulate weird goes here */  
}

それが私が使っているイディオムです。

于 2008-11-27T01:13:44.240 に答える
0

std::vectorテンプレートは、データが連続して格納されることを保証します。フロント要素のアドレス (たとえば、&v[0]) を取得すると、C スタイルの配列を介してベクター内の他の要素にアクセスできます。STL のソース コードをデバッガで使用できるようにする必要はありません。


このいくつかをいじった後、 と がインライン化されv.front()v.begin()いる可能性が高く、GDB がそれらを見つけられていないようです。探し続けますが、個人的には、ソース ファイルに行を追加して、デバッグ中int* i = &v[0]に GDB コマンドを使用するだけです。iコンパイラはそのデッド コードを自由に削除できることに注意してください。iそれを避けるために値を出力するか、単純に最適化を行わないようにする必要があるかもしれません。

于 2008-11-26T22:44:06.447 に答える