2013-06-05 28 views
6

通常、enumの値は単純なコンパイラでインクリメントされた値であるか、または直接的に整数リテラルに設定されているため、値を簡単に推測したり、ソースファイルを見て直接見ることができます。Windbgでは、デバッグ中に列挙値を表示するにはどうすればよいですか?

ただし、時にはenumの値を使用して、クラス内の定数を他の場所で定義された値または簡単に複製できないコンパイル時の式の結果と同じに設定します。

これらのトリッキーなケースに対して、それぞれenumメンバーの実際の値をWindbgに表示する方法はありますか?

答えて

9

この小さな構造体考えてみましょう:最速の方法は、あなたがする必要がある、スイッチ-r(あなたがenumメンバーをリストする必要が再帰)と-v(冗長を使用して、dtコマンドを使用することです

struct foo 
{ 
    enum enum1 
    { 
     enum1_val1_ = 5, 
     enum1_val2_, 
    }; 

    enum enum2 
    { 
     enum2_val1_ = 0x0001, 
     enum2_val2_ = 0x0010, 
    }; 

    enum 
    { 
     // assume these come from complicated compile-time expressions 
     some_class_constant_ = 86, 
     another_one_ = 99, 
    }; 
}; 

をリストのすべてのenum秒):

0:000> dt -r -v foo 
LangTestingD!foo 
struct foo, 3 elements, 0x1 bytes 
Enum enum1, 2 total enums 
     enum1_val1_ = 0n5 
     enum1_val2_ = 0n6 
Enum enum2, 2 total enums 
     enum2_val1_ = 0n1 
     enum2_val2_ = 0n16 
Enum <unnamed-tag>, 2 total enums 
     some_class_constant_ = 0n86 
     another_one_ = 0n99 

あなたはそれが各列挙型の値でも無名の1が表示されていることを見ることができます。複数の名前のない列挙型はすべて正しくリストされます。それはそれぞれ1とリストそのメンバーに再帰しようとするすべてのデータメンバー、すべての機能のメンバー、すべての列挙、

dt -r -v fooの問題は、それがfooのすべての単一のメンバーをリストしていることです。 fooが複雑なクラス(継承を取得する方が簡単です)の場合、出力は膨大になり、探している列挙型を見つけるのは難しいでしょう。

ので、次のオプションが具体的には、あなたが望むENUM dtを伝えることです:

0:000> dt foo::enum1 
LangTestingD!foo::enum1 
    enum1_val1_ = 0n5 
    enum1_val2_ = 0n6 

さて、素晴らしいです!しかし、その名前のないenumについてはどうですか?さて、上記の出力を確認してください。ここでは<unnamed-tag>が使用されています。多分私たちはそれを使うことができます。

0:000> dt foo::<unnamed-tag> 
Couldn't resolve error at 'foo::<unnamed-tag>' 

実際には動作しますが、追加のスイッチを2台使用する必要があります。あなたが-nを組み合わせると(名前の接頭辞として次のパラメータと一致して)、それは、一種の、作品と-y(次のパラメータは名前です):

0:000> dt -n -y foo::<unnamed-tag> 
LangTestingD!foo::<unnamed-tag> 
    some_class_constant_ = 0n86 

しかし、最初の値のみがリストされています。さらに悪いことに、複数の名前のない列挙型がある場合、最初の列挙型の最初の値だけがリストされます。複数の名前のない列挙型はあまり一般的ではないので、これで十分ですが、絶対に必要な場合は、-r -vを使用して出力で見つけてください。

関連する問題