Como puedo depurar un fallo de asignacion de memoria en C++???

Iniciado por kafok, 9 Noviembre 2014, 19:55 PM

0 Miembros y 1 Visitante están viendo este tema.

kafok

Ahora tengo otro problema... he rediseñado mi proyecto de nuevo, los heap ya son correctos... pero... cuando asigno estaticamente memoria (es decir, en variables y no punteros, no se como se llama exactamente eso) me sigue dando problemas de violacion de acceso.

Mi clase tiene unos pocos de constructores, los cuales estoy testeando. Lo hice declarando un array para tener las multiples variables que cree bien situadas tal que asi:

Código (cpp) [Seleccionar]
MiClase clase[64];

Eso me tira error al finalizar el programa. Lo siguiente me da error cuando creo una variable desde el constructor tal que:

Código (cpp) [Seleccionar]
MiClase *clase = new MiClase[64];

Es decir, que en el momento que hago:

Código (cpp) [Seleccionar]
clase[0] = MiClase(1.0f)    //Por ejemplo

Crashea con el mismo error. Solo funciona de forma "estatica" (como yo lo llamo) si son variables independientes, es decir, no arrays.

Mi duda ahora es, tengo alguna limitacion para asignar a este tipo de variables desde una dll? de ser asi, ¿Como limito al usuario para que solo pueda usar new para crear objetos (no de forma "estatica")? Bueno, lo mismo es que yo este haciendo algo mal y no tengo ningun tipo de limitaciones  :-X

Eternal Idol

El problema es tu codigo, puede ser un constructor, un metodo o un destructor, vaya uno saber,  no tenemos el codigo. Te lo digo nuevamente: descarga, instala y usa el Application Verifier.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

kafok

#22
Creo que se lo que pasa....

1) No se usar Application Verifier: Si, descargue el sdk de depuracion de windows cuando me lo dijo. He estado utilizando el WinDbg, y he estado intentando comprender el Application Verifier pero no soy capaz... haber cojo la aplicacion cargo mi programa y selecciono los test en la derecha y pulso save. Despues, ¿Usa el depurador de mi IDE, o como va eso?

2) Creo que se donde esta el problema: Me imagino que al hacer new y tenerlo sobrescrito para que guarde la memoria en el heap que le diga, los atributos de mis clases que no sean punteros se guardaran en dicho heap, pero ¿y cuando no uso new para inicializar el objeto?¿Donde se guarda ese atributo? Creo que ese es el problema, que se guarda donde no debe.

Entonces, si fuera ese el problema podria solucionarlo creando los atributos de forma dinamica, pero para el atributo que me da problemas uso una clase del std, string. Entonces ahora me surgen las siguientes dudas:

   -¿Como asigno al heap que yo quiera una clase de la que puedo sobrescribir el operador new? Es decir, ¿como guardo un objeto string en mi heap?

   -Si declarara el resto de atributos de mis clase a partir de punteros y los inicializara en el constructor y liberara en el destructor, si declaro una variable "estatica", como yo las llamo, de esa clase, al finalizar el ambito de esa varible ¿Se llamaria al destructor y liberaria esa memoria asignada o se liberara al finalizar el programa?

   -Y por ultimo, ya por curiosidad, una variable que no es un puntero, es decir, que no se inicializa con new ¿Como se llama eso? Yo las llamo inicializadas estaticamente, porque de otra forma es dinamicanmete, pero no se la terminologia real  :P

Eternal Idol

Cita de: kafok en 28 Noviembre 2014, 00:00 AM1) No se usar Application Verifier: Si, descargue el sdk de depuracion de windows cuando me lo dijo. He estado utilizando el WinDbg, y he estado intentando comprender el Application Verifier pero no soy capaz... haber cojo la aplicacion cargo mi programa y selecciono los test en la derecha y pulso save. Despues, ¿Usa el depurador de mi IDE, o como va eso?

Simplemente ejecuta tu programa con WinDbg, ahi veras excepciones no controladas especialmente lanzadas por el Application Verifier al detectar errores.


PD. Lo siento pero ya no voy a seguir usando mi bola de cristal: o lo depuras vos mismo o subis un minidump - y de paso el PDB - para que lo haga otro.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

kafok

Siento mucho haber abierto otro hilo... Cuando mas o menos supe donde estaba el problema pense que debia ponerlo en otro hilo. Haber es que soy bastante principiante en temas de depuracion y me siento un poco perdido. Intente hacer al pie de la letra lo que me dijiste que hiciera con WinDbg y Application Verifier, pero aun asi no supe solucionarlo. No me gusta la idea de que otro usuario lo haga por mi, porque me gustaria aprender a hacerlo y sobretodo no me gusta la idea de comprometer a nadie, pero para ser sinceros me harian un gran favor, pero por favor expliqueme con detalle como genero el minidump y el PDB, subo el exe y el codigo si hace falta, y como y donde lo subo, ya he dicho que soy muy novato y aun no domino muchas cosas. Muchas gracias de antemano

Eternal Idol

Cita de: kafok en  2 Diciembre 2014, 02:16 AM
Siento mucho haber abierto otro hilo... Cuando mas o menos supe donde estaba el problema pense que debia ponerlo en otro hilo.

Si realmente sabes donde esta el problema lo mejor para todos es que lo reduzcas a la minima expresion y lo publiques (de esa manera no solo no nos tendras que dar tu trabajo completo sino que ademas sera mas sencillo analizar el problema al quitar todo lo superfluo).

Cita de: kafok en  2 Diciembre 2014, 02:16 AMHaber es que soy bastante principiante en temas de depuracion y me siento un poco perdido. Intente hacer al pie de la letra lo que me dijiste que hiciera con WinDbg y Application Verifier, pero aun asi no supe solucionarlo. No me gusta la idea de que otro usuario lo haga por mi, porque me gustaria aprender a hacerlo y sobretodo no me gusta la idea de comprometer a nadie, pero para ser sinceros me harian un gran favor, pero por favor expliqueme con detalle como genero el minidump y el PDB, subo el exe y el codigo si hace falta, y como y donde lo subo, ya he dicho que soy muy novato y aun no domino muchas cosas. Muchas gracias de antemano

Si lo queres hacer por tu cuenta te puedo recomendar dos libros "Inside Windows Debugging" de Tarik Soulami y "Advanced Windows Debugging" de Mario Hewardt y Daniel Pravat.

¿Que IDE usas? El PDB suele ser generado automaticamente por VC++. Para generar un dump podes usar el mismo WinDbg con el comando .dump, en la ayuda explica detalladamente los modificadores pero podrias empezar con /f.

¿Como lo subis a Internet? Amigo, busca en Google.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

kafok

Cita de: Eternal Idol en  2 Diciembre 2014, 11:03 AM
Si lo queres hacer por tu cuenta te puedo recomendar dos libros "Inside Windows Debugging" de Tarik Soulami y "Advanced Windows Debugging" de Mario Hewardt y Daniel Pravat.

Muchas gracias por la recomendacion, la estudiare :)

Cita de: Eternal Idol en  2 Diciembre 2014, 11:03 AM
¿Que IDE usas? El PDB suele ser generado automaticamente por VC++. Para generar un dump podes usar el mismo WinDbg con el comando .dump, en la ayuda explica detalladamente los modificadores pero podrias empezar con /f.

Uso CodeBlocks. El PDB es eso de las simbolos de mi programa? Yo para generar los simbolos uso en la configuracion del copilador la bandera -g. Aun asi estudiare como hacer eso.

Cita de: Eternal Idol en  2 Diciembre 2014, 11:03 AM
¿Como lo subis a Internet? Amigo, busca en Google.

Lo preguntaba porque puedo dejar enlaces a mega o a dropbox, pero en un muchos foros no puede hacerse eso, por temas de seguridad. Solo queria asegurarme de como lo puedo hacer

Entonces, ¿Dejo un link en este post cuando lo tenga todo no?¿O sino, como lo hago?

Eternal Idol

Cita de: kafok en  2 Diciembre 2014, 14:23 PMUso CodeBlocks. El PDB es eso de las simbolos de mi programa? Yo para generar los simbolos uso en la configuracion del copilador la bandera -g. Aun asi estudiare como hacer eso.

Yo trabajo solo con las herramientas de Microsoft pero buscando en Google encontre este metodo (no hagas el paso del strip):

http://blog.morlad.at/blah/mingw_postmortem

Cita de: kafok en  2 Diciembre 2014, 14:23 PMLo preguntaba porque puedo dejar enlaces a mega o a dropbox, pero en un muchos foros no puede hacerse eso, por temas de seguridad. Solo queria asegurarme de como lo puedo hacer

Entonces, ¿Dejo un link en este post cuando lo tenga todo no?¿O sino, como lo hago?

Las reglas prohiben publicar enlaces a programas compilados, no hace falta en este caso, solo se necesita un dump y los simbolos de depuracion (archivo .PDB) para empezar.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

kafok

He hecho lo que e podio, aunque la pagina esa es de lo mejorcito que he encontrado por google para este tema, no he conseguido generar el PDB desde mi exe, ese programa falla. El tema del dump he hecho lo que he podido. Asi que, paso el codigo de donde esta el problema y nada mas, los dump que he podido generar y un archivo con detalle de lo que he hecho. Entiendo que valla contra las normas, por motivos de seguridad o por lo que sea, pero en el archivo de texto hay un link donde estan el exe compilado con la dll compilada, ambos generados con informacion de depuracion que no he podido aislar. He pasado el codigo de los archivos esos asi que solo he puesto el link por si es necesario, pero pueden generarse a partir del codigo que doy.

https://mega.co.nz/#!CYtFSZja!5DQ8DNqf07Sl2mmvMW2IzO2IiAUjValG_TduohfejQI

Eternal Idol

#29
Código (c++) [Seleccionar]
Miclase ass[21];

El ejecutable tiene una definicion diferente de Miclase (sin miembros) que la de la DLL - algo que no se podia asumir del codigo que dejaste anteriormente - y al instanciar los objetos usa un tamaño erroneo, teniendo el string definido como en la DLL funciona correctamente.




Si queres seguir ocultando la implementacion te recomiendo leer este articulo e implementar la interfaz abstracta:
HowTo: Export C++ classes from a DLL.

Otra opcion:
http://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón