Freigeben über


Gewusst wie: Festlegen von Haltepunkten für eine Speicherreservierungsnummer

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.

Hinweis:

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Anhand des Dateinamens und der Zeilennummer im Speicherverlustbericht ist erkennbar, wo der betreffende Speicherbereich reserviert ist. Zu wissen, wo der Verlust aufgetreten ist, reicht jedoch nicht immer aus, um das Problem zu identifizieren. Häufig wird eine Reservierung während der Programmausführung mehrmals aufgerufen, wobei der Speicherverlust nur bei bestimmten Aufrufen auftreten kann. Um das Problem einzugrenzen, muss nicht nur der reservierte Bereich mit dem Speicherverlust erkennbar sein, sondern auch die Bedingung, unter der der Verlust auftritt. Genau diese Informationen liefert die Speicherreservierungsnummer. Es handelt sich dabei um die Nummer in Klammern hinter dem Dateinamen und der Zeilennummer (sofern diese angezeigt werden). In der folgenden Ausgabe ist beispielsweise die Speicherreservierungsnummer 18. Dies bedeutet, dass der verlorene Speicher der 18. im Programm zugeordnete Speicherblock ist.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Die CRT-Bibliothek zählt alle während der Programmausführung reservierten Speicherblöcke, einschließlich aller Blöcke, die durch die CRT-Bibliothek selbst oder durch andere Bibliotheken, wie CRT, reserviert wurden. Daher ist ein Objekt mit der Reservierungsnummer N das Nte Objekt, das im Programm reserviert wurde. Es entspricht jedoch nicht unbedingt dem Nten Objekt, das durch den Code reserviert wurde. (In den meisten Fällen ist dies nicht der Fall.)

Sie können die Reservierungsnummer verwenden, um an den Stellen, an denen Speicher reserviert wird, einen Haltepunkt festzulegen. Zu diesem Zweck legen Sie in der Nähe des Programmstarts einen Positionshaltepunkt fest. Wenn das Programm an diesem Punkt unterbrochen wird, können Sie einen solchen Speicherreservierungshaltepunkt im Dialogfeld Schnellüberwachung oder im Überwachungsfenster festlegen.

Prozedur

So legen Sie einen Speicherreservierungs-Haltepunkt im Überwachungsfenster fest

  1. Geben Sie im Überwachungsfenster in der Spalte Name den folgenden Ausdruck ein.

    _crtBreakAlloc
    

    Bei Verwendung der Multithreaded-DLL-Version der CRT-Bibliothek (/MD-Option), schließen Sie, wie hier gezeigt, den Kontextoperator ein:

    {,,msvcr71d.dll}_crtBreakAlloc
    
  2. Drücken Sie die EINGABETASTE.

    Der Debugger wertet den Aufruf aus und gibt das Ergebnis in der Spalte Wert aus. Wenn Sie keine Haltepunkte für Speicherreservierungen festgelegt haben, lautet dieser Wert –1.

  3. Ersetzen Sie den Wert in der Spalte Wert durch die Reservierungsnummer der Speicherreservierung, bei der die Unterbrechung erfolgen soll. Um eine Unterbrechung bei der Reservierung im obigen Beispiel zu bewirken, geben Sie beispielsweise 18 ein.

Nachdem die Haltepunkte für alle wichtigen Speicherreservierungen festgelegt wurden, können Sie mit dem Debugvorgang fortfahren. Achten Sie darauf, das Programm unter denselben Bedingungen wie zuvor auszuführen, sodass die Reservierungen in derselben Reihenfolge stattfinden. Wenn das Programm an der angegebenen Speicherreservierung unterbrochen wird, können Sie dem Fenster Aufrufliste sowie anderen Debuginformationen entnehmen, unter welchen Bedingungen der Arbeitsspeicher reserviert wurde. Falls erforderlich, können Sie die Programmausführung an dieser Stelle fortsetzen, um festzustellen, was mit dem Objekt geschieht, und ggf. zu ermitteln, warum es nicht ordnungsgemäß freigegeben wird.

Hinweis:

Es kann hilfreich sein, einen Datenhaltepunkt für das Objekt festzulegen. Weitere Informationen finden Sie unter Gewusst wie: Festlegen eines Datenhaltepunkts (nur systemeigen).

Obwohl es gewöhnlich einfacher ist, Speicherreservierungs-Haltepunkte im Debugger festzulegen, können sie ggf. auch im Code festgelegt werden.

So legen Sie einen Speicherreservierungs-Haltepunkt im Code fest

  • Fügen Sie eine mit dem folgenden Beispiel vergleichbare Zeile (für die 18. Speicherreservierung) hinzu:

    _crtBreakAlloc = 18;
    

Alternativ können Sie die _CrtSetBreakAlloc-Funktion verwenden, die dieselben Auswirkungen hat:

_CrtSetBreakAlloc(18);

Siehe auch

Aufgaben

Gewusst wie: Verwenden des Fensters "Aufrufliste"

Konzepte

Speicherverlusterkennung und -isolation

Weitere Ressourcen

Variablenfenster