Freigeben über


Verwenden von _crtBreakAlloc zum Debuggen einer Speicherzuweisung

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

Originalproduktversion: Visual C++
Ursprüngliche KB-Nummer: 151585

Zusammenfassung

Beim Nachverfolgen von Speicherlecks mithilfe der Debug-C-Runtime (CRT) ist es häufig nützlich, einen Haltepunkt unmittelbar festzulegen, bevor der Speicher zugeordnet wird, der den Speicher verursacht. Durch Festlegen _crtBreakAlloc zur Kompilierungszeit oder Laufzeit können Sie einen benutzerdefinierten Haltepunkt an einem bestimmten Punkt der Speicherzuweisung verursachen.

Weitere Informationen

Beim Nachverfolgen von Speicherlecks mit Debug-CRT-Funktionen, z _CrtDumpMemoryLeaks. B. wird häufig eine in geschweifte Klammern ({}) eingeschlossene Zuordnungsnummer angezeigt. Im Folgenden sehen Sie z. B. einen Speicherverlust bei der Zuordnungsnummer 18:

Erkannte Speicherlecks!
Dumpingobjekte ->
{18} normaler Block bei 0x00660BE4, 10 Bytes lang
Daten: <> CD
Objektabbild abgeschlossen.

Es ist nützlich, einen Haltepunkt direkt festzulegen, bevor dieser Speicher zugewiesen wird, damit Sie den Callstack durchlaufen und sehen können, welche Funktionen diesen Speicher zugeordnet haben. Die Debug-CRT-Funktion _CrtSetBreakAlloc , mit der Sie eine Zuordnungsnummer angeben können, mit deren Rahmen sie aufbrechen können. 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 Zuordnungs-Haltepunkt dynamisch festzulegen. Diese Methode hat den Vorteil, dass keine Quellcodeänderungen erforderlich sind oder neu kompiliert werden müssen.

Wenn Sie statisch mit der C-Laufzeit verknüpfen, wird die Variable, die Sie ändern möchten, aufgerufen _crtBreakAlloc. Wenn Sie dynamisch eine Verknüpfung mit der C-Laufzeit herstellen, ist {,,msvcr40d.dll}__p__crtBreakAlloc() die Variable, die Sie im Überwachungsfenster ä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 bestimmen Sie, mit welcher Version des CRT Sie kompilieren:

  1. Wählen Sie im Menü "Erstellen" die Option "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 nur eine Konfiguration im Bereich "Einstellungen für:" ausgewählt haben.)

Führen Sie die folgenden Schritte aus, um einen Zuordnungs-Haltepunkt dynamisch festzulegen:

  1. Starten Sie Ihre Debugsitzung. Wählen Sie im Menü "Erstellen" die Option "Debuggen> – Schritt-In" aus. Wenn Sie das "Debug Single-Threaded" oder "Debug Multithreaded CRT" 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, mit der Ihr Programm beendet wird. Diese Zuordnungsnummer sollte -1 sein, wenn Ihr Programm zum ersten Mal gestartet wird.

    2. Geben Sie {,,msvcr40d.dll}__p__crtBreakAlloc() in das Ü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, mit der Ihr Programm beendet wird. Diese Zuordnungsnummer sollte -1 sein, wenn Ihr 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 "Debuggen ->Go" aus.

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