Cum să utilizați _crtBreakAlloc pentru a depana o alocare de memorie


Rezumat


Atunci când depistați pierderi de memorie folosind debug C-Runtime (CRT), este deseori util să setați o întrerupere imediată imediat înainte de a aloca memoria care cauzează scurgerea. Prin setarea _crtBreakAlloc la compilarea timpului sau a execuției, puteți provoca o întrerupere definită de utilizator la un anumit punct de alocare a memoriei.

Mai multe informații


Atunci când se monitorizează scurgerile de memorie cu funcțiile de depanare-CRT, cum ar fi _CrtDumpMemoryLeaks, apare deseori un număr de alocare încadrat în acolade ({}). De exemplu, următoarea este o scurgere de memorie la numărul de alocare 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. 
Este util să setați o întrerupere la dreapta înainte ca această memorie să fie alocată, astfel încât să puteți parcurge callstack și să vedeți ce funcții determină această memorie să fie alocată. Funcția debug-CRT _CrtSetBreakAlloc care vă permite să specificați un număr de alocare la care să întrerupeți. Această metodă necesită Recompilarea programului de fiecare dată când doriți să setați o întrerupere de alocare. O metodă alternativă este să utilizați fereastra vizionare și să setați dinamic repartiția de repartiție. Această metodă are avantajul de a nu necesita modificări sau Recompilarea codului sursă. Dacă vă legați static la timpul de rulare C, variabila pe care doriți să o modificați se numește _crtBreakAlloc. Dacă vă conectați în mod dinamic la timpul de rulare C, variabila pe care doriți să o modificați în fereastra ceas este {,, msvcr40d. dll} * __p__crtBreakAlloc () Dacă utilizați Visual C++ 4,0 sau 4,1. Variabila pe care doriți să o modificați în fereastra supraveghere ar trebui să fie {,, msvcrtd. dll} * __p__crtBreakAlloc () Dacă utilizați Visual C++ 4,2 sau o versiune mai recentă. Pentru a determina ce versiune de CRT compilați cu:
  1. Din meniul generare, alegeți setări.
  2. În panoul Setări pentru:, selectați configurația pentru care construiți. Alegeți fila C/C++, apoi selectați categoria generare cod.
Caseta de dialog utilizare bibliotecă de execuție ar trebui să apară afișând versiunea CRT pe care o utilizați. (Dacă această setare este necompletată, asigurați-vă că ați selectat o singură configurație în panoul Setări pentru:.) Pentru a seta o întrerupere dinamică a alocării, efectuați pașii următori:
  1. Porniți sesiunea de depanare. Din meniul generare, alegeți depanare-> pas-into. Dacă utilizați "debug single-threaded" sau "debug multi-threaded CRT", urmați Pasul 1a. Altfel, urmați pasul 1b.
    1. Tastați _crtBreakAlloc în fereastra supraveghere. Aceasta afișează numărul de alocare curent la care se va opri programul. Acest număr de alocare ar trebui să fie-1 atunci când pornește programul pentru prima dată.
    2. Tastați {,, msvcr40d. dll} * __p__crtBreakAlloc () în fereastra supraveghere dacă utilizați Visual C++ 4,0 sau 4,1. Tastați {,, msvcrtd. dll} * __p__crtBreakAlloc () Dacă utilizați Visual C++ 4,2 sau o versiune mai recentă. Aceasta afișează numărul de alocare curent la care se va opri programul. Acest număr de alocare ar trebui să fie-1 atunci când pornește programul pentru prima dată.
  2. Faceți dublu clic pe valoarea-1 și introduceți noul număr de alocare care determină o întrerupere definită de utilizator.
  3. Din meniul depanare, alegeți depanare-> Go.
Pentru mai multe informații despre _crtBreakAlloc, consultați "urmărirea solicitărilor de alocare a heap-ului" din ajutorul online.