Bruke _crtBreakAlloc til å feilsøke en minnetildeling


Sammendrag


Når Sporing minnelekkasjer ved hjelp av debug C Runtime (CRT), er det ofte nyttig å angi et stoppunkt rett før tildeling av minne som fører til at lekkasje. Ved å angi _crtBreakAlloc på enten kompileringstid eller kjøring, kan det føre til en brukerdefinert stoppunkt ved et bestemt punkt minnetildeling.

Hvis du vil ha mer informasjon


Når sporing av minne lekker med Debug-CRT-funksjoner, for eksempel _CrtDumpMemoryLeaks, vises en tildeling-nummeret som er omsluttet av klammeparenteser ({}) ofte. Følgende er for eksempel en minnelekkasje på tildeling nummer 18:

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00660BE4, 10 bytes long
Data: < > CD CD CD CD CD CD CD CD CD CD
Object dump complete.
Det er nyttig å sette et stoppunkt høyre før dette minnet blir tildelt slik at du kan gå gjennom callstack og se hvilke funksjoner som forårsaker dette minnet å få tildelt. Debug-CRT, funksjonen _CrtSetBreakAlloc som lar deg angi en tildeling nummer som skal brytes. Denne metoden krever at du kompilere programmet hver gang du vil angi et stoppunkt for tildelingen. En alternativ metode er å bruke overvåkingsvinduet og satte stoppunktet tildeling dynamisk. Denne metoden har fordelen av ikke å kreve endringer kilde kode eller rekompilering.


Hvis du kobler statisk til C-kjøring, kalles variabelen du vil endre _crtBreakAlloc. Hvis du kobler dynamisk i kjøretid C, variabelen du vil endre i Watch-vinduet er {,, msvcr40d.dll} * __p__crtBreakAlloc () Hvis du bruker Visual C++ 4.0 eller 4.1. Variabelen du vil endre, i vinduet skal se {,, msvcrtd.dll}*__p__crtBreakAlloc() Hvis du bruker Visual C++ 4.2 eller nyere.


Slik fastslår du hvilken versjon av CRT du kompilerer med:

  1. Velg innstillinger på Lag-menyen.
  2. I innstillingene for:-ruten velger du konfigurasjonen du bygger for. Velg C/C++-kategorien, og velg deretter kategorien kodegenerering.
Bruk kjøretidsbiblioteket dialogboksen skal vises vise versjonen av CRT du bruker. (Hvis denne innstillingen er tomt, kontrollerer du at du har bare merket én konfigurasjon på siden Innstillinger for: ruten.)


Hvis du vil angi et stoppunkt tildeling dynamisk, kan du utføre følgende trinn:

  1. Starte feilsøking-økt. Velg Debug Build-menyen -> trinn i. Hvis du bruker "Debug enkelttrådet" eller "Debug Multi - trådet CRT", følger du trinn 1a. Ellers følger du trinn 1b.


    1. Skriv inn _crtBreakAlloc i overvåkingsvinduet. Dette viser feltet gjeldende tildeling nummeret som programmet skal stoppe. Dette nummeret for tildeling må være -1 når programmet starter for første gang.
    2. Type {,, msvcr40d.dll}*__p__crtBreakAlloc() i overvåkingsvinduet Hvis du bruker Visual C++ 4.0 eller 4.1. Type {,, msvcrtd.dll}*__p__crtBreakAlloc() Hvis du bruker Visual C++ 4.2 eller nyere. Dette viser feltet gjeldende tildeling nummeret som programmet skal stoppe. Dette nummeret for tildeling må være -1 når programmet starter for første gang.
  2. Dobbeltklikk verdien-1, og angi det nye nummeret for tildelingen som fører til at et brukerdefinert stoppunkt.
  3. Velg Debug Debug-menyen -> gå.
Hvis du vil ha mer informasjon om _crtBreakAlloc, se "Sporing av Heap tildeling Requests" i elektronisk hjelp.