GDBでSTL C ++コンテナ値にアクセスできない

私はC ++のコードをデバッグしており、std :: listにアクセスしようとすると問題が発生します。 問題は、ヘッドノードに関連付けられたアドレスを取得できないことです($ 3はリストを参照しています)。

p $3._M_impl._M_node
$21 = {
    _M_next = 0x240ee70, 
    _M_prev = 0x240ee70
}

ヘッドノードアドレスを取得しようとすると、次のエラーメッセージが表示されます。

(gdb) p &($3._M_impl._M_node)

メモリにない値のアドレスを取得しようとします。

私はまた、インターネットから入手可能なSTL拡張機能を試しましたが、同じ点でも失敗します。

set $head = &$arg0._M_impl._M_node

私はGoogleを見ましたが、これは私が問題について見つけることができるすべてです:

http://permalink.gmane.org/gmane.comp.gdb.devel/9496

しかし、それは私の問題を解決しません。どんな提案も歓迎される以上のものです。

前もって感謝します

2
まあ、この特定のリストは明らかに空です。これがあなたがリストのすべてであるならば、私はその全体の価値が登録されたものであると想像することができます。それは渡されます(引数として返されるか、渡されます)。
追加された 著者 Dietmar Kühl,
個人的には、別の関数に渡される空のリストが必ずしも「そこに」あるとは限りません!私はそれが今のところメモリにしないいくつかのレジスタのほんの少しのポインタであることを願っています...
追加された 著者 Dietmar Kühl,
stl-views( sourceware.org/gdb/wiki/STLSupport )を見てください。
追加された 著者 Richard Corden,
どのレベルの最適化でもコードをコンパイルすると、空のリストのポインタがレジスタに入っていることに驚くことはありません。最適化せずにコンパイルしてみて、gdbが内容を報告するかどうか確認してください。
追加された 著者 Christian Shay,
あなたはそうだった私はリストが空であることを認識しませんでした。しかし、リストが空であっても、ヘッドノードはそこにあるはずです。私はそのアドレスを取得できるはずです。私はリストを作成し、いくつかの要素を追加するという小さな例を試しました。次に、2つのブレークポイントを定義しました。ひとつは要素を追加した後、もう一つはリストをクリアした後です。どちらの場合も、ヘッドノードのアドレスを取得できます。
追加された 著者 user1192525,
こんにちはビル。コードは次のオプションを使用してコンパイルされました:-O0 -g。もっと多くのフラグを有効/無効にしなければならないかどうかはわかりません。ありがとう。
追加された 著者 user1192525,
こんにちはDietmar、リストは属性であり、オブジェクトはまだ存在します。つまり、ヘッドノードアドレスを取得しようとすると、それは破壊されていません。
追加された 著者 user1192525,

答えはありません

0