elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Como puedo depurar un fallo de asignacion de memoria en C++???
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] 4 Ir Abajo Respuesta Imprimir
Autor Tema: Como puedo depurar un fallo de asignacion de memoria en C++???  (Leído 14,301 veces)
kafok

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #20 en: 27 Noviembre 2014, 21:39 pm »

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
  1. 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
  1. MiClase *clase = new MiClase[64];

Es decir, que en el momento que hago:

Código
  1. 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


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #21 en: 27 Noviembre 2014, 22:47 pm »

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.


En línea

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

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #22 en: 28 Noviembre 2014, 00:00 am »

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
« Última modificación: 28 Noviembre 2014, 00:12 am por kafok » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #23 en: 28 Noviembre 2014, 00:13 am »

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?

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.
En línea

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

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #24 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. 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
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #25 en: 2 Diciembre 2014, 11:03 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).

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

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.
En línea

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

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #26 en: 2 Diciembre 2014, 14:23 pm »

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 :)

¿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.

¿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?
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #27 en: 2 Diciembre 2014, 15:20 pm »

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.

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

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?

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.
En línea

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

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #28 en: 3 Diciembre 2014, 01:03 am »

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
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como puedo depurar un fallo de asignacion de memoria en C++???
« Respuesta #29 en: 3 Diciembre 2014, 02:08 am »

Código
  1. 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
« Última modificación: 3 Diciembre 2014, 02:53 am por Eternal Idol » En línea

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
Páginas: 1 2 [3] 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Asignación de memoria en C
Programación C/C++
Akkon 3 4,119 Último mensaje 30 Abril 2011, 15:22 pm
por Akkon
Asignacion Dinamica Memoria
Programación C/C++
charmedever 5 3,742 Último mensaje 21 Octubre 2011, 05:25 am
por charmedever
Problema con asignación dinamica de memoria.
Programación C/C++
ThePinkPanther 9 5,061 Último mensaje 4 Febrero 2013, 00:56 am
por ThePinkPanther
asignacion dinamica de memoria
Programación C/C++
d91 2 2,470 Último mensaje 1 Junio 2014, 05:09 am
por Drewermerc
Depurar la asignacion de memoria.
Programación C/C++
AlbertoBSD 1 1,677 Último mensaje 19 Mayo 2016, 00:28 am
por Stakewinner00
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines