Freigeben über


Reservierungshooks und Speicherreservierungen von C-Laufzeitbibliotheken

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

Thema ist nicht vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Pro, Premium und Ultimate

Thema ist nicht vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Eine äußerst wichtige Einschränkung für Reservierungshookfunktionen besteht darin, dass _CRT_BLOCK-Blöcke (die von C-Laufzeitbibliotheken intern vorgenommenen Speicherbelegungen) ignoriert werden müssen, falls Aufrufe an C-Bibliotheksfunktionen gesendet werden, durch die interner Speicher belegt 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 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.

Wenn Sie die Quelldateien der Laufzeitbibliothek untersuchen, werden Sie feststellen, dass sich die standardmäßige Reservierungshookfunktion CrtDefaultAllocHook (die einfach TRUE zurückgibt) in einer separaten Datei namens DBGHOOK.C befindet. Wenn der Reservierungshook auch für die Zuordnungen aufgerufen werden soll, die vom Laufzeitstartcode vorgenommen wurden, der vor der main-Funktion der Anwendung ausgeführt wird, 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