2013-06-05 11 views
6

Zwykle wartości enum są prostymi wartościami zwiększanymi przez kompilator lub są ustawiane bezpośrednio na integralny tekst, a więc wartości można łatwo wywnioskować lub zobaczyć bezpośrednio, patrząc na plik źródłowy.W Windbg, w jaki sposób mogę wyświetlić wartości wyliczenia podczas debugowania?

Jednak czasami wartości enum są używane do ustawiania stałej w klasie równej wartości zdefiniowanej gdzie indziej lub do wyniku wyrażenia podczas kompilacji, który nie jest łatwo duplikowany.

Czy istnieje sposób, aby Windbg pokazał mi faktyczną wartość każdego członka enum dla tych trudniejszych spraw?

Odpowiedz

9

Rozważmy ten mały struct:

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, 
    }; 
}; 

Najszybszym sposobem jest użycie komendy dt, za pomocą przełączników -r (recurse, które trzeba wymienić członków enum) i -v (opisowy, co trzeba lista enum y w ogóle):

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 

Widać, że to lista wartości każdego wyliczenia nawet nienazwany jeden. Wiele nazw nienazwanych zostanie wymienionych poprawnie.

Problem z dt -r -v foo jest to, że można znaleźć każdy członek foo: Wszyscy członkowie danych, wszystkie elementy funkcyjne, wszystkie teksty stałe, i próbuje rekursja do każdego z nich i list jego członków. Jeśli foo jest złożoną klasą, która jest raczej łatwa do uzyskania z dziedziczeniem, wynik będzie ogromny i trudno będzie znaleźć to jedno enum, którego szukasz.

Więc następnym rozwiązaniem jest powiedzieć dt ENUM, które chcesz, a konkretnie:

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

Dobra, świetnie! Ale co z tym nienazwanym wyliczeniem? Cóż, mówisz, sprawdź wyjście powyżej, gdzie używa <unnamed-tag>. Może możemy tego użyć.

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

To zadziała, ale musisz użyć kilku dodatkowych przełączników. Kiedy połączy -n (po parametrem jest nazwa) i -y (mecz następny parametr jako przedrostek nazwy) to, coś, działa:

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

Jednak tylko pierwsza wartość jest na liście. Co gorsza, jeśli istnieje wiele nienazwanych wyliczeń, wymieniona jest tylko pierwsza wartość pierwszego. Często to wystarczy, ponieważ wiele nienazwanych wyliczeń nie jest zbyt częste, ale jeśli ich absolutnie potrzebujesz, musisz użyć -r -v i po prostu znaleźć je w wynikach.

Powiązane problemy