Freigeben über


crt_dbg2-Beispiel: C-Laufzeit – Debuggen von Hookfunktionen

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.

SicherheitshinweisSicherheitshinweis

Dieser Beispielcode soll lediglich ein Konzept veranschaulichen. Es wird nur der für das jeweilige Konzept relevante Code dargestellt. Möglicherweise erfüllt dieser nicht die Sicherheitsanforderungen für eine bestimmte Umgebung, und er sollte nicht genau wie dargestellt verwendet werden. Wir empfehlen, Sicherheits- und Fehlerbehandlungscode hinzuzufügen, um Ihre Projekte sicherer und stabiler zu machen. Microsoft stellt diesen Beispielcode "wie besehen" und ohne Garantien zur Verfügung.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

So greifen Sie auf Beispiele aus Visual Studio zu

  • Klicken Sie im Menü Hilfe auf Beispiele.

    Standardmäßig werden diese Beispiele unter Laufwerkbuchstabe:\Programme\Microsoft Visual Studio 10.0\Samples\ installiert.

  • Eine aktuelle Version dieses Beispiels und eine Liste anderer Beispiele finden Sie unter Visual Studio Samples auf der MSDN-Website.

Erstellen und Ausführen des Beispiels

So erstellen Sie dieses Beispiel und führen es aus

  1. Öffnen Sie die Projektmappe crt_dbg2.sln.

  2. Klicken Sie im Menü Erstellen auf die Option Erstellen.

  3. 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 belegter 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

Siehe auch

Weitere Ressourcen

Allgemeine Beispiele