Beim Debuggen Variablen im Watch-Window oder im Quick-View anzeigen zu lassen ist gängige Praxis und jeder etwas fortgeschrittene Entwickler wird diese Funktionen des Visual-Studios nutzen.
Üblicherweise wählt der Debugger eine Darstellungsform, die für die Variable geeignet ist. Besonders für STL Datentypen hat sich hier einiges getan seit VC-2005.
Dennoch kann man dem Debugger für manche Datentypen noch einen Format Specifier mitgeben, der einem die Arbeit beim Debuggen extrem erleichert.
Format Specifier erlauben es eine Variable entsprechend Ihrer Verwendung zu interpretieren. Typisch hier wäre eine Windows Nachricht. Als Integer sagt einem 0x0129 nicht viel, aber WM_NCCREATE einiges. Wenn man hinter die Variable nMsg im Watch-Fenster einfach aus nMsg,wm erweitert erhält man sofort die Nachricht als symbolischen Wert angezeigt.
Ich will hier nicht alle aber wenigstens ein paar sehr nützliche und weniger bekannte Format Specifier aufzählen:
! – Raw format
hr – HRESULT in Klartext
su -Unicode
s8 – UTF8
wm – Windowsnachricht
wc – Fensterstil
<n> – Anzahl der Arrayelemente
Am schönsten sieht man die Wirkung an dem folgenden Code und den nachfolgenden Bildern der Watch-Windows:
int g_ai[] =
{
4711,
815,
1234
};
int _tmain(int argc, _TCHAR* argv[])
{
std::list lst;
lst.push_back(1);
lst.push_back(2);
DWORD dwHResult = 2147943623;
void *szUnicode = L"Unicode ÄÖÜäöü";
char *szUTF8Code = "Umlaute AE=\xc3\x84 OE=\xc3\x96 UE=\xc3\x9c.";
UINT winmsg = 125;
DWORD winstyle = 0xA6730000;
int *pi = g_ai;
DebugBreak();
return 0;
}
Hier das Ganze die Daten im Watchwindow ohne Formatspecifier:
Hier das Ganze mit:
Weitere Links dazu:
http://msdn.microsoft.com/en-us/library/75w45ekt.aspx
http://blogs.msdn.com/vcblog/archive/2006/08/04/689026.aspx
Hi Martin,
es gibt noch weitere Format specifiers, in Deinen Linkverweisen nicht dokumentiert.
Diese möchte ich dem abitionierten Nutzer nicht vorenthalten:
eax
zeigt den Rückgabewert einer Win32-API Funktion an. Dies ist vor allem dann nützlich, wenn im Quelltext keine Variable dafür vorgesehen bzw. zugewiesen wird ist (ideal für „quick debugging“ ohne neu compilieren zu müssen)
@err
zeigt den aktuellen Wert des GetLastError() an.
Mit der Kombination @err,hr wird dieser auch gleich als Klartext angezeigt
Diese Format Specifier funktionieren auf jeden Fall seit Visual Studio 6
Gruß
Martin
Anmerkung:
eax und @err sind keine Formatspecifier.
– eax ist einfach das Register, also eine Variable.
– und @err ist ein so genanntes Pseudo-Register
Ich hatte diese nicht erwähnt, weil Sie nicht zum Thema gehören 😉
Diese Pseudoregister sind alle bei John Robbins erklärt und auch in dem folgenden Artikel:
http://www.codeproject.com/KB/debug/pseudoregister.aspx
Hallo Martin,
Sehr gut erklaert.
Leider funktioniert „s8“ bei mir nicht:
Microsoft Visual Studio 2008
Version 9.0.30729.1 SP
szUTF8Code,s8 error: unknown format specifier ’s8′
szUTF8Code 0x00018738 „Umlaute AE=Ä OE=Ö UE=Ãœ.“ char*
Hast du vielleicht dafuer eine Erklaerung?
Danke, mfG Alfred