crt_dbg2-Beispiel: C-Laufzeit – Debuggen von Hookfunktionen
Aktualisiert: November 2007
Das crt_dbg2-Beispiel veranschaulicht einige Verwendungsmöglichkeiten für Hookfunktionen für das Debuggen mit den Debugversionen der C-Laufzeitbibliothek. Um das Beispiel realitätsnäher zu gestalten, enthält es Elemente einer echten Anwendung und auch zwei Fehler.
Hinweis: |
---|
Dieses Beispiel wird von Intel Itanium-Prozessoren nicht unterstützt. |
Sicherheitshinweis: |
---|
Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird. |
So rufen Sie Beispiele und Anweisungen für ihre Installation ab
Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.
Weitere Informationen finden Sie unter Suchen von Beispieldateien.
Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.
Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.
Erstellen und Ausführen des Beispiels
So erstellen Sie dieses Beispiel und führen es aus
Öffnen Sie die Projektmappe crt_dbg2.sln.
Klicken Sie im Menü Erstellen auf die Option Erstellen.
Wählen Sie im Menü Debuggen die Option Starten ohne Debuggen.
So funktioniert das Beispiel
Das Programm speichert Geburtsdaten in einer verknüpften Liste von Clientblöcken. Eine Hookfunktion für Clientdumps überprüft die Geburtsdaten und erstellt einen Bericht über den Inhalt der Clientblöcke. Eine Hookfunktion für Reservierungen protokolliert Heapoperationen in einer Textdatei, und die Hookfunktion für Berichte protokolliert bestimmte Berichte in derselben Textdatei.
Beachten Sie, dass die Hookfunktion für Reservierungen CRT-Blöcke (intern von der C-Laufzeitbibliothek reservierter Speicher) explizit vom Protokoll ausschließt. Die Hookfunktion verwendet fprintf zum Schreiben in die Protokolldatei, und fprintf reserviert einen CRT-Block. Wenn CRT-Blöcke in diesem Fall nicht ausgeschlossen wären, würde eine Endlosschleife entstehen und einen Stapelüberlauf erzeugen: fprintf würde einen Aufruf der Hookfunktion auslösen, diese würde wiederum fprintf aufrufen, wodurch erneut die Hookfunktion aufgerufen würde usw.
Wenn Sie CRT-Blöcke im Reservierungshook erfassen möchten, verwenden Sie anstelle der C-Laufzeitfunktionen besser Windows-API-Funktionen. Da Windows-APIs nicht den CRT-Heap verwenden, führen sie die Hookfunktion auch nicht in eine Endlosschleife.
Der Debugheap fängt im zweiten Beispiel zwei Programmfehler und einen Datenfehler ab. Ein Programmfehler bewirkt, dass das Feld für den Namen des "Geburtstagskindes" für einige Testnamen zu kurz ist. Das Feld müsste größer sein, und strncpy müsste anstelle von strcpy verwendet werden. Der zweite Programmfehler befindet sich in der While-Schleife in der printRecords-Funktion: Die Schleife dürfte erst beendet werden, wenn HeadPtr selbst gleich null ist. Dieser Fehler bewirkt nicht nur die unvollständige Anzeige der Geburtstage, sondern auch einen Speicherverlust. Zu guter Letzt gibt es auch noch einen Datenfehler: Gauß wurde am 30. April, nicht am 32. April geboren.
Schlüsselwörter
In diesem Beispiel werden die folgenden Schlüsselwörter verwendet:
_assert; _asserte; _crtcheckmemory; _crtmemcheckpoint; _crtmemdumpallobjectssince; _crtmemdumpstatistics; _crtsetallochook; _crtsetdbgflag; _crtsetdumpclient; _crtsetreportfile; _crtsetreporthook; _crtsetreportmode; _free_dbg; _malloc_dbg; _rpt4; _strdate; _strtime; aboutbox; clear_crt_debug_field; createinstance; createrecord; displaystring; donttouch; exit; fatalerror; fclose; fflush; fopen; fprintf; fputs; get_size; helpstring; id; iid_is; module; myallochook; mydumpclienthook; myreporthook; pointer_default; printf; printrecords; put_size; set_crt_debug_field; strcpy_s; strstr; uuid