gdb で std::vector の内容を調べたいのですが、gcc ではなく icc を使用しているため、_M_impl にアクセスできません。どうすればよいですか? 簡単にするために、それが std::vector だとしましょう。
ここに非常に良い答えがありますが、icc を使用すると機能しません。エラー メッセージは「_M_impl という名前のメンバーまたはメソッドがありません」です。ここには優れたデバッグ ツールセットがあるようですが、_M_impl にも依存しています。
これがあなたのベクトルで機能するかどうかはわかりませんが、私にとっては機能しました。
#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"
通常、デバッガーでコンテナー クラスを扱うときは、要素への参照をローカル変数として作成します。これにより、コンテナーの実装をいじることなく、デバッガーで簡単に確認できます。
これは不自然な例です。
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 */
}
それが私が使っているイディオムです。
std::vector
テンプレートは、データが連続して格納されることを保証します。フロント要素のアドレス (たとえば、&v[0]
) を取得すると、C スタイルの配列を介してベクター内の他の要素にアクセスできます。STL のソース コードをデバッガで使用できるようにする必要はありません。
このいくつかをいじった後、 と がインライン化されv.front()
てv.begin()
いる可能性が高く、GDB がそれらを見つけられていないようです。探し続けますが、個人的には、ソース ファイルに行を追加して、デバッグ中int* i = &v[0]
に GDB コマンドを使用するだけです。i
コンパイラはそのデッド コードを自由に削除できることに注意してください。i
それを避けるために値を出力するか、単純に最適化を行わないようにする必要があるかもしれません。