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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Crashes en contenedores de std que uso en una DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Crashes en contenedores de std que uso en una DLL  (Leído 1,702 veces)
kafok

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Crashes en contenedores de std que uso en una DLL
« en: 2 Diciembre 2014, 00:10 am »

Hola, necesito ayuda. Llevo un par de meses con un problema, aprovechando el tiempo y aprendiendo a depurar entre otras cosas, pero ya estoy llegando al limite, necesito solucionarlo yaa!!

Bueno mi problema es el siguiente, estoy desarrollando una libreria en dos versiones, dll y estatica. Y me encuentro con crashes por violacion de acceso por todos lados. Despues de mucho tiempo depurando y aprendiendo muchas cosas sobre implementaciones a bajo nivel mi proyecto tiene la siguiente pinta (de momento):

  • Una clase generica llamada Object de la que heredaran el resto de clases de mi proyecto. Por temas de diseño he tomado ese pratron y la verdad que me ha ayudado a solucionar gran parte de los problemas. Esta clase tiene sobrescritos new y delete para asignar y desasignar memoria en los lugares correctos, sino en la dll tenemos problemas.
  • Un par de clases que tienen atributos privados que son contenedores std como string y set.

Tengo el mismo problema tanto si es una dll como una libreria estatica. Con el siguiente codigo de pruebas resulta lo siguiente:

(.h) en la dll:
Código
  1. class Miclase    //Obviamente exportado con __declspec (dllexport) en el caso de la dll
  2. {
  3.    private:
  4.        string str;
  5.  
  6.    public:
  7.        Miclase();
  8.        ~Miclase();
  9.  
  10. };

(.cpp) en la dll:
Código
  1. Miclase::Miclase()
  2. {
  3.    str = string("prueba");
  4. }
  5.  
  6. Miclase::~Miclase()
  7. {
  8. }

La aplicacion que uso para testear las librerias tiene la siguiente pinta:

Código
  1. int main(int argc, char** argv)
  2. {
  3.    Miclase prueba[20];
  4.    system("pause");
  5.  
  6.    return 0;
  7. }

Use Un array para declarar distintas variables en los test

El codigo anterior crashea (el tipico window dejo de funcionar) por culpa de una violacion de acceso (codigo 0xC0000005 en windows o el procesador lanza una SIGSEGV, mismo efecto). El error esta en el destructor, en concreto en el destructor de la string en este caso. Pero pasa lo mismo con todos los contenedores de la std.

Cambiando estos codigos no produce ese error:

este:
Código
  1. string str;
por este:
Código
  1. string *str;

y este:
Código
  1. str = string("prueba");
por este:
Código
  1. str = new string("prueba");

se soluciona el problema, pero al usar delete en el destructor vuelve a suceder. Esto solo me pasa si son variables, si son punteros y usando new no hay ningun problema. Posiblemente sea por la asignacion dinamica de estas clases, como ya dije tengo sobrescrito new y delete y eso puede que haya solucionado algo... Pero el caso anterior necesita de una solocion, sino no podre continuar mi proyecto...  :-(

He probado todo ya, y no se que puede pasar, incluso he diseñado un allocator para estos tipos pero da el mismo resultado... ¿QUE PUEDO HACER?


« Última modificación: 2 Diciembre 2014, 00:28 am por kafok » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.969


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


Ver Perfil WWW
Re: Crashes en contenedores de std que uso en una DLL
« Respuesta #1 en: 2 Diciembre 2014, 01:46 am »

He probado todo ya, y no se que puede pasar, incluso he diseñado un allocator para estos tipos pero da el mismo resultado... ¿QUE PUEDO HACER?

Podes:
Depurar tu codigo con WinDbg ayudado por Application Verifier
Subir un minidump del crash - y de paso el PDB - para que lo depure otro usuario
Reducir el problema a la minima expresion compilable (y reproducible) y publicarlo para que otro usuario lo depure

Lo que NO podes hacer es abrir otro hilo para el mismo problema.


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] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Contenedores de Archivos
Programación Visual Basic
Yekka 3 1,975 Último mensaje 30 Octubre 2007, 19:35 pm
por Yekka
Random Freezes/crashes en Centos 6.4
GNU/Linux
Gotttlieb 3 2,708 Último mensaje 2 Septiembre 2013, 19:06 pm
por Gotttlieb
CONTENEDORES STL vector
Programación C/C++
chicainge 4 2,416 Último mensaje 9 Junio 2014, 10:50 am
por chicainge
Microsoft añadiría contenedores Hyper-V a Windows 10
Noticias
wolfbcn 0 1,080 Último mensaje 3 Diciembre 2015, 21:44 pm
por wolfbcn
Contenedores anidados. (Arraylist)
Java
cunian 6 5,720 Último mensaje 24 Mayo 2017, 11:27 am
por marvin49
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines