Coding with Titans

so breaking things happens constantly, but never on purpose

Formatowanie wyrażeń w oknie Watch w Visual Studio

Visual Studio Watch Window

Debugowanie i podglądanie wartości zmiennych w oknie Watch, często byłoby dużo wygodniejsze, gdyby dane można rzutować na inne typy oraz poddawać je innym manipulacjom. Na szczęście prócz wymuszenia zmiany typów, okno to posiada wbudowany zestaw predefinowanych formatów, które mogą pobierać dane ze znanych typów wyliczeniowych (Windows Messages lub Code Errors) lub po prostu odczytywać napisy ANSI / UTF-16, bądź traktować dane jako tablice o zadanej wielkości, podając wartości wszystkich elementów. Wpisujemy je po przecinku na końcu wyrażenia, np.:

  • lpszFileName, su –> spowoduje wyświetlenie zawartości zmiennej jako tekstu UTF-16
  • dwMessage, wm –> wyświetli zadaną liczbę jako kod Winows Message (WM_CREATE, …)
  • index, x –-> wyświetli liczbę w trybie hexadecymalnym
  • (char *)lpszDeviceName, 10 –> wyświetli 10 pierwszych znaków napisu

Dla C++ ten zestaw formatów przedstawia się następująco:

Nazwa formatuOpis działaniaPrzykładowe wyrażenieWyświetlane
d, isigned decimal integer0x1122FF, d
uunsigned decimal integer0x11, u
ounsigned octal integer
x, Xhexadecimal integer
l, hprzedrostek long/short dla: d, i, u, o, x, X
fsigned floating point
esigned scientific notation
gsigned floating point lub signed scientific notation w zależności od tego, który jest krótszy
csingle character
sstring
suUnicode string0x023571FA, su
hrHRESULT0x00000000L, hrS_OK
wcflagi Windows Class0x00000040, wcWC_DEFAULTCHAR
wmnumery komunikatów Windows Message0x0001, wmWM_CREATE
!raw format, usuwa wszystkie informacje o typie

Nazwa formatuOpis działaniaPrzykładowe wyrażenie
ma64 ASCII characterslpData, ma
m16 bytes in hexadecimal, followed by 16 ASCII characterslpData, m
mb16 bytes in hexadecimal, followed by 16 ASCII characterslpData, mb
mw8 wordslpData, mw
md4 doublewordslpData, md
mq2 quadwordslpData, mq
mu2-byte characters (Unicode)lpData, mu

Tak samo i w programach w języku C# formaty przestawiają się:

Nazwa formatuOpis działaniaPrzykładowe wyrażenieWyświetlane
ddecimal integer0x64100
hhexadecimal integer110xB
nqstring without quotes“Sample Text”Sample Text
privateWyświetla prywatne zmienne obiektu.
rawWyświetla dane własne obiektu. Poprawne tylko dla typów pośredniczących (proxy).
AcWymusza wyliczanie wartości wyrażeń (przydatne gdy wyliczanie wartości i właściwości jest wyłączone).

Jako ostatnie chciałem przestawić pseudo-zmienne, które pokazują charakterystyki uruchamianej aplikacji:

Pseudo-zmiennaOpis działania
$handlesWyświetla liczbę zaalokowanych uchwytów (HANDLE) aplikacji.
$vframeWyświetla adres aktualnej ramki stosu (stack frame).
$TIDWyświetla ID aktualnego wątku.
$ENVWyświetla rozmiar środowiska przekazanego podczas uruchamiania aplikacji. Próba edycji tej wartości wyświetli wszystkie zmienne środowiskowe w oknie Output, bez wykonania jakiejkolwiek zmiany.
$CMDLINEWyświetla rozmiar linii poleceń, którą uruchomiono program. Próba edycji wartości wyświetli wartość tekstową tej linii w oknie Output, bez jakiejkolwiek zmiany.
$registername or @registernameWyświetli zawartość rejestru o zadanej nazwie.
$clkWyświetli aktualny czas w cyklach.
$userWyświetli informacje o koncie użytkownika, z którego uruchomiono aplikację.
$exception (C#, VB.NET, F#)Wyświetli informacje o ostatnim wyjątku.

Więcej informacji można znaleźć w MSDN (o C++ tutaj, o C# tutaj).