Freigeben über


Reservierungshooks und Speicherreservierungen von C-Laufzeitbibliotheken

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Nur "Systemeigen"

Standard

Nur "Systemeigen"

Pro und Team

Nur "Systemeigen"

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

Eine äußerst wichtige Einschränkung für Reservierungshookfunktionen besteht darin, dass _CRT_BLOCK-Blöcke (die von C-Laufzeitbibliotheken intern vorgenommenen Speicherreservierungen) ignoriert werden müssen, falls Aufrufe an C-Bibliotheksfunktionen gesendet werden, durch die interner Speicher reserviert wird. Die _CRT_BLOCK-Blöcke können ignoriert werden, wenn Sie am Anfang der Reservierungshookfunktion z. B. folgenden Code einfügen:

    if ( nBlockUse == _CRT_BLOCK )
        return( TRUE );

Werden _CRT_BLOCK-Blöcke nicht vom Reservierungshook ignoriert, kann es vorkommen, dass eine im Hook aufgerufene C-Laufzeitbibliotheksfunktion das Programm in eine Endlosschleife führt. Beispielsweise nimmt printf eine interne Reservierung vor. Wenn durch den Hookcode printf aufgerufen wird, bewirkt die daraus resultierende Reservierung, dass der Hook erneut aufgerufen wird, wodurch wiederum printf aufgerufen wird usw., bis ein Stapelüberlauf auftritt. Wenn Sie _CRT_BLOCK-Reservierungsoperationen in einem Bericht ausgeben möchten, können Sie diese Beschränkung umgehen, indem Sie für die Formatierung und die Ausgabe anstelle der C-Laufzeitfunktionen Windows-API-Funktionen verwenden. Da der Heap der C-Laufzeitbibliothek nicht von Windows-APIs verwendet wird, führen sie den Reservierungshook nicht in eine Endlosschleife.

Bei einer näheren Betrachtung der Quellcodedateien für die Laufzeitbibliothek werden Sie feststellen, dass die standardmäßige Reservierungshookfunktion CrtDefaultAllocHook (die einfach TRUE zurückgibt) in einer separaten Datei mit dem Namen Dbghook.c gespeichert ist. Wenn der Reservierungshook auch für die Reservierungen aufgerufen werden soll, die durch den vor der main-Funktion der Anwendung ausgeführten Laufzeitstartcode vorgenommen werden, können Sie diese Standardfunktion durch eine eigene Funktion ersetzen, anstatt _CrtSetAllocHook zu verwenden.

Siehe auch

Aufgaben

crt_dbg2-Beispiel: C-Laufzeit – Debuggen von Hookfunktionen

Weitere Ressourcen

Schreiben von Hookfunktionen zum Debuggen