Verwenden von _crtBreakAlloc zum Debuggen einer Speicherzuweisung

In diesem Artikel wird beschrieben, wie Sie _crtBreakAlloc eine Speicherzuweisung debuggen.

Originalversion des Produkts:   Visual C++
Ursprüngliche KB-Nummer:   151585

Zusammenfassung

Beim Nachverfolgen von Speicherlecks mithilfe der Debug-C-Runtime (CRT) ist es häufig hilfreich, unmittelbar vor der Zuweisung des Speichers, der das Leck verursacht, einen Haltepunkt festzulegen. Wenn Sie entweder zur Kompilierzeit oder zur Laufzeit festlegen _crtBreakAlloc , können Sie an einem bestimmten Punkt der Speicherzuweisung einen benutzerdefinierten Haltepunkt verursachen.

Weitere Informationen

Beim Nachverfolgen von Speicherlecks mit Debug-CRT-Funktionen, z _CrtDumpMemoryLeaks. B. wird häufig eine in geschweifte Klammern ({}) eingeschlossene Zuordnungsnummer angezeigt. Es folgt beispielsweise ein Speicherverlust bei Der Zuordnungsnummer 18:

Festgestellte Speicherverluste!
Dumpingobjekte ->
{18} Normaler Block bei 0x00660BE4, 10 Bytes lang
Daten: < > CD
Objektabbild abgeschlossen.

Es ist hilfreich, einen Haltepunkt direkt vor der Zuweisung dieses Speichers festzulegen, damit Sie den Callstack durchlaufen und sehen können, welche Funktionen dazu führen, dass dieser Speicher zugewiesen wird. Die Debug-CRT-Funktion _CrtSetBreakAlloc , mit der Sie eine Zuordnungsnummer angeben können, bei der der Umbruch ausgeführt werden soll. Diese Methode erfordert, dass Sie Ihr Programm jedes Mal neu kompilieren, wenn Sie einen Zuordnungshaltepunkt festlegen möchten. Eine alternative Methode besteht darin, das Überwachungsfenster zu verwenden und den Zuordnungshaltepunkt dynamisch festzulegen. Diese Methode hat den Vorteil, dass keine Quellcodeänderungen oder eine Neukompilierung erforderlich sind.

Wenn Sie statisch eine Verknüpfung mit der C-Laufzeit herstellen, wird die Variable aufgerufen _crtBreakAlloc, die Sie ändern möchten. Wenn Sie dynamisch mit der C-Laufzeit verknüpfen, ist die Variable, die Sie im Überwachungsfenster {,,msvcr40d.dll}__p__crtBreakAlloc() ändern möchten, wenn Sie Visual C++ 4.0 oder 4.1 verwenden. Die Variable, die Sie im Überwachungsfenster ändern möchten, sollte sein {,,msvcrtd.dll}__p__crtBreakAlloc() , wenn Sie Visual C++ 4.2 oder höher verwenden.

So ermitteln Sie, mit welcher Version des CRT Sie kompilieren:

  1. Wählen Sie im Menü "Erstellen" Einstellungen aus.

  2. Wählen Sie im Bereich Einstellungen für: die Konfiguration aus, für die Sie erstellen. Wählen Sie die Registerkarte C/C++ und dann die Kategorie " Codegenerierung " aus.

Das Dialogfeld "Laufzeitbibliothek verwenden" sollte angezeigt werden, um die version des verwendeten CRT anzuzeigen. (Wenn diese Einstellung leer ist, stellen Sie sicher, dass Sie im Bereich Einstellungen für: nur eine Konfiguration ausgewählt haben.)

Führen Sie die folgenden Schritte aus, um einen Zuordnungshaltepunkt dynamisch festzulegen:

  1. Starten Sie die Debugsitzung. Wählen Sie im Menü "Erstellen" die Option "Debuggen > "Schritt-in" aus. Wenn Sie "Single-Threaded debuggen" oder "Multithreaded-CRT debuggen" verwenden, führen Sie Schritt 1a aus. Führen Sie andernfalls Schritt 1b aus.

    1. Geben Sie im Überwachungsfenster _crtBreakAlloc ein. Dies zeigt die aktuelle Zuordnungsnummer an, an der Ihr Programm beendet wird. Diese Zuordnungsnummer sollte -1 sein, wenn Das Programm zum ersten Mal gestartet wird.

    2. Geben Sie {,,msvcr40d.dll}__p__crtBreakAlloc() im Überwachungsfenster ein, wenn Sie Visual C++ 4.0 oder 4.1 verwenden. Geben Sie {,,msvcrtd.dll}__p__crtBreakAlloc() ein, wenn Sie Visual C++ 4.2 oder höher verwenden. Dies zeigt die aktuelle Zuordnungsnummer an, an der Ihr Programm beendet wird. Diese Zuordnungsnummer sollte -1 sein, wenn Das Programm zum ersten Mal gestartet wird.

  2. Doppelklicken Sie auf den Wert -1 , und geben Sie die neue Zuordnungsnummer ein, die einen benutzerdefinierten Haltepunkt verursacht.

  3. Wählen Sie im Menü "Debuggen" die Option "DebugGo -> " aus.

Weitere Informationen finden _crtBreakAllocSie unter "Nachverfolgen von Heap-Zuordnungsanforderungen " in der Onlinehilfe.