Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Purificador De Memoria? (debug)

Iniciado por Warchief, 06 de Abril de 2005, 03:42:07 AM

« anterior - próximo »

Warchief

 Pues algo tipo purify, valgrind, electric fence, pero para Windows. Quiero saber si tengo pérdidas de memoria (bueno yo no, el programa), porque no termina bien a veces; cosa harto difícil de depurar a pelo.

Gracias de antemano.

Jikan

 

        NuMega (Compuware) BoundsChecker (ó el DevPartner Studio que incluye este producto)

               - Jikan  

zupervaca

 si es c++ y con visual c++ o .net puedes crear una clase estatica que son los ultimos objetos en destruirse y llamar a la funcion _CrtDumpMemoryLeaks(), para inicializar el sistema de depuracion del visual es con esto:
#define CRTDBG_MAP_ALLOC
#include    
#include

Te pongo un ejemplo de como lo puedes hacer:
#ifdef _DEBUG
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
class UltimaClaseQueSeDestruye
{
public:
 ~UltimaClaseQueSeDestruye()
 {
  _CrtDumpMemoryLeaks();
 }
};
static UltimaClaseQueSeDestruye g_Ultima;
#endif _DEBUG


no obstante puedes usar el boundchequer, a mi hubo una temporada que me iva bien pero no es gratis  :(  

Warchief

 Gracias por las respuestas. No he podido probar aún nada, pero creo que servirá con _CrtDumpMemoryLeaks; (estoy en c++ con msvc sí).

Warchief

 Pues creo que la razón de que mis programas se queden colgaos al veces al salir es:


#include <allegro.h>

#ifdef _DEBUG               // only in debugmode (F5)
 #define DEBUGMODE         // some useless allegro thing
 #define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>      
 #include <crtdbg.h>       // all this above for _CrtDumpMemoryLeaks()
#endif

int main(int argc, char* args[]) {

#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif

return 0;
} END_OF_MAIN();


Esto me da leaks! Es normal??


Detected memory leaks!
Dumping objects ->
{47} normal block at 0x00981CA0, 256 bytes long.
Data: <                > D1 1D 98 00 00 00 00 00 CD CD CD CD CD CD CD CD
{46} normal block at 0x00981DD0, 65 bytes long.
Data: <"C:\DOCUMENTS AN> 22 43 3A 5C 44 4F 43 55 4D 45 4E 54 53 20 41 4E
Object dump complete.


Me extraña un poco porque el 46 es parte del path, pero estoy perdido.

Ayuda please?




Detected memory leaks!
Dumping objects ->
{53} normal block at 0x00991AF0, 256 bytes long.
Data: <a               > 61 1E 99 00 00 00 00 00 CD CD CD CD CD CD CD CD
{52} normal block at 0x00991E60, 50 bytes long.
Data: <"C:\Personales\R> 22 43 3A 5C 50 65 72 73 6F 6E 61 6C 65 73 5C 52
{47} normal block at 0x00990030, 33 bytes long.
Data: < C              > 00 43 00 CD CD CD CD CD CD CD CD CD CD CD CD CD
{46} normal block at 0x00991DB0, 40 bytes long.
Data: < |L             > 14 7C 4C 10 16 00 00 00 00 00 00 00 00 00 00 00
Object dump complete.

con este código:

#ifdef _DEBUG               // only in debugmode (F5)
 #define DEBUGMODE        
 #define _CRTDBG_MAP_ALLOC
 #include <stdlib.h>      
 #include <crtdbg.h>       // all this above for _CrtDumpMemoryLeaks()
#endif

int main(int argc, char* args[]) {
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif
return 0;
} END_OF_MAIN();

// pero en un proyecto distinto de msvc


:blink:

fiero

 Si haces doble click en la línea donde muestra el memory leak (donde pone {46}...) te lleva hasta donde se declaró la variable que no se libera.

un saludo
www.videopanoramas.com Videopanoramas 3D player

Warchief

 
Cita de: "fiero"Si haces doble click en la línea donde muestra el memory leak (donde pone {46}...) te lleva hasta donde se declaró la variable que no se libera.

un saludo
Uhm, no. Hablamos de la pestaña "debug" de la ventana output no? No me deja clickar, sólo seleccionar.


Vale, en cualquier caso me doy por estúpido yo mismo.  (nooo)  El primer ejemplo

Detected memory leaks!
Dumping objects ->
{47} normal block at 0x00981CA0, 256 bytes long.
Data: <                > D1 1D 98 00 00 00 00 00 CD CD CD CD CD CD CD CD
{46} normal block at 0x00981DD0, 65 bytes long.
Data: <"C:\DOCUMENTS AN> 22 43 3A 5C 44 4F 43 55 4D 45 4E 54 53 20 41 4E
Object dump complete.


47 es int argc
46 char* argv[]
XD, paré el debug en el return y lo vi.

Siento el post estúpido.   (rules)



Bueno, la verdad es que ya no estoy seguro porque con main(void) también me sale lo mismo, y 256 bytes para un entero me parece un poco excesivo.

Warchief

 Ya se pasó el tiempo de modificar.


Dije que eran int argc y char* argv pero lo del int no tiene sentido claro está.
Además con main(void) también me sale lo mismo, y 256 bytes para un entero... ya de por sí era estúpido.


@fiero
si pongo un int* x = (int*)malloc(10); sí me deja clickar, pero los otros errores no.


Es posible que sean del .lib de allegro?

TheAzazel

Cita de: "Warchief"Ya se pasó el tiempo de modificar.


Dije que eran int argc y char* argv pero lo del int no tiene sentido claro está.
Además con main(void) también me sale lo mismo, y 256 bytes para un entero... ya de por sí era estúpido.


@fiero
si pongo un int* x = (int*)malloc(10); sí me deja clickar, pero los otros errores no.


Es posible que sean del .lib de allegro?
tiene toda la pinta de venir de la lib de allegro....

zupervaca

 yo de la alegro ni idea pero uno es un path que no se libera despues de usarse, busca funciones como split o la constante MAX_PATH

saludos

zupervaca

 perdonar el segundo post seguido, si puedes haz que la alegro no se compile estaticamente

saludos






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.