2009-04-29 7 views
1

Metrowerks CodeWarriorデバッガのSTL std::list<T>で簡単にデータを表示できますか?私は一度にリストに要素を歩いて構造体のメンバの隣に少し「+」サインを展開することができ、そのようなCodeWarriorデバッガでSTLリストを検査するにはどうすればよいですか?

instances->__list_imp.__list_deleter.end_.compressed_pair_imp.second_.prev_->data_ 

などの表現を見ることで、リストの先頭や末尾に近いデータを表示することができますが、これは面倒なことです。約20〜30個の要素の後で、ツリーはデバッガウィンドウのために広すぎます。私が調べているリストには2000以上の要素があります。

CodeWarriorデバッガは式で関数を呼び出すことをサポートしていないため、(++(++instances.begin()))などの値を調べることはできません。非常に長くて不便な名前を持つ構造体メンバしか見ることができません。

デバッガのウィンドウも約245文字に制限されていますので、N番目のノードに展開するばかげた長い式を生成するスクリプトを書くことはできません。

コードを少しずつ追加、再コンパイル、再デバッグする必要があるものはあまり役に立ちませんので、再生に数時間かかる問題をデバッグしようとしています。しかし、他の選択肢がない場合、私はそれをしなければならないかもしれません。

答えて

1

これは間違いなく "簡単な方法"ではありません(あなたが "+"で行っていることよりも簡単ではないかもしれませんが)場合によってはウォッチビューを扱うよりも便利です。それは、あなたが本当に悪い状況(ウォッチ・ビューが何らかの理由でほとんど機能しない場所、またはバイナリ・メモリ・ダンプ・ファイルを持っているところ)でデバッグすることを許可するかもしれません。次と前の中にあってもよいこと

 
struct List 
{ 
    Node * next; 
    Node * prev; 
    size_t size; 
} 

template 
struct Node 
{ 
    Node * next; // last node will point to list rather than another node 
    Node * prev; // first node will point to list rather than another node 
    T payload; // e.g. in a std::list this would be a Foo * payload 
} 

注:のstd ::リストで

、あなたは通常、メモリに次のようになります実装を持って(必要に応じて仕様について<リスト>を参照してください)あなたの実装では逆の順序です。

& myListは、ほとんどの実装では基本的に "end()"と同等です。

メモリビューを使用している場合は、& myListの近くを突き止めることができます。これにより、myList.prevまたはmyList.nextポインターの値を見つけて、それを見るためにメモリー・ビューを変更することができます。あなたはあなたのリストの最後か最初のノードにそれぞれ行きました。

ノードに到達したら、prev、next、またはpayloadを見てからprevまたはnextに移動できます。泡立て、リンス、リピート。もしあなたが& myListに戻ってしまったら、あなたは全部をたどったことを知っています。

痛いと退屈?おそらく。しかし、あなたはあなたのstlの実装に精通している場合がありますが、場合によっては起こりうるstompsを簡単に "見る"ことができます。

(あなたがしてきた場所のノートを保つ、それが混乱するのはとても簡単です。)

0

デバッガは確かに多くのSTLフレンドリーである可能性があります。私はCodeWarriorに特に精通していませんが、のデバッグウィンドウから何も関数を呼び出すことはできません。それとも、私が使用していた他のデバッガと似ていますか?プログラムが既に終了している場合は、あなたが関数を呼び出せません(ABORT、segfault、...))、(2)テンプレート拡張を伴う関数を呼び出すことはできません(画像にコードを追加する必要があるかもしれませんが)。(3)コードがブレークポイントで停止した場合に静的リンク関数を呼び出すことができますか?

後者の場合、テンプレートにテンプレート化されていない関数を1つ以上追加して、list<T>をCスタイルのTの配列にコピーしたい場合があります。あなたのデバッグウィンドウからその種の機能を実行して、それから配列要素を調べてあなたのリストにあるものを見つけてください。デバッグウィンドウから関数を呼び出すことができない場合は、その関数の呼び出しをエラーポイントの近くのコードに置き、結果を確認する必要があります。可能であれば、これらの呼び出しを監視して、デバッグフラグが設定されているときにのみ呼び出されるようにします。

0

私が持っていた問題は、リストに数千の要素があったという事実によるものです。

この特定のSTL実装では、prevポインタが各ノードのオフセット0に格納されていたため、逆参照を繰り返すだけで後ろのリンクに従うことができました。以下の怪物は後方20のリンクになります。フォワードリンクをたどる

********************((Metrowerks::node_base**********************)instances->__list_imp.__list_deleter.end_.compressed_pair_imp.second_) 

を使用すると、各デリファレンスした後、4バイトで相殺する必要があるため、さえ醜いです。

関連する問題