Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - kafok

#1
Programación C/C++ / Re: Problema con strings
6 Diciembre 2014, 03:33 AM
No estoy seguro de eso, pero creo que me dio problemas cuando trabaje con los edit y creo que no llegue a solucinar del todo, pero el mensaje EM_GETLINE devuelve cuantos caracteres a copiado. Si devuelve 4, pues en tu buffer la quinta posicion la pones a '\0', que el maximo es 9 y se copian 9 caracteres.... pues facil, reserva una mas, es decir 10, y si copia los 9 caracteres pon en tu buffer en la decima posicion el caracter nulo. Vamos, que lo hagas a mano como quien dice.
#2
Programación C/C++ / Re: Problema con strings
6 Diciembre 2014, 01:40 AM
Haber, lo que puedes hacer:

PD: tengo la api de window un poco olvidada, pero creo que los buffers que devuelve windows no terminan en caracter nulo, cuidado!
#3
aaaaaaaaa!! vale vale, sobrecargue el operador = tal y como dice la pagina, ya entiendo todos los errores que me salian. Es que no entendi muy bien porque sobrecargaba ese operador en la pagina, lo estuve mirando con calma y ya entendi el porque sobrecargarlo, y ya se porque fallaba en ese fragmentito de codigo y mas fallos que daba en mi programa real.

Ya funciona bien!! mi dll ya no da problemas!! a costado, pero al fin fucnionaaaaa!!

Muchisimas gracias
#4
Ese codigo era de un test de hace tiempo, lo hice asi porque para probar despues constructores con new solo tenia q poner asterisco en la declaracion y poner el new delante asi: ss[0] = new Miclase();

Vale, al tiempo me di cuenta de que el constructor por defecto ahi era una tonteria, pero bueno, resulto que por el simple hecho de estar ahi falla. Se supone que tiene que fallar? Si es asi, ¿Como debo sobrecargar el operadir de asignacion?

Y que hago para que no falle con HeapAlloc, en vez de new,¿Tengo que definor un Allocator o que? Me interesaria tenerlo todo en el mismo heap.
#5
Y vuelven los problemas, aqui hay sitio para todos! vale, no!

Redefini la clase Miclase de la siguiente forma:

Código (cpp) [Seleccionar]
class DLL_EXPORT Miclase
{
    private:
        struct OpaquePointer;
        OpaquePointer *op;

    public:
        Miclase();
        ~Miclase();
};


y en el .cpp:

Código (cpp) [Seleccionar]
struct Miclase::OpaquePointer
{
    string str;
};

Miclase::Miclase() : op(new OpaquePointer())
{
    op->str.clear();
}

Miclase::~Miclase()
{
    delete op;
}


y mi codigo cliente:

Código (cpp) [Seleccionar]
int main()
{
    Miclase ss[21];
    ss[0] = Miclase(); /* AQUI! */
    system("pause");

    return 0;
}


La linea que señalo es la que me da problemas, en mi codigo uso la funcion que me recomendaros en este hilo hace tiempo: SetUnhandledExceptionFilter. Y me salta la excepcion, pero si no pongo nada como es el caso del codigo de arriba habria que depurar para darse cuenta de que se lanza una excepcion. La excepcion salta en el destructor del elemento al que se le vuelve a llamar un construnctor por defecto. Depurando paso a paso con mi IDE, en esa linea confilctiva se llama al destructor y se vuelve a construir el nuevo. Si quito la linea y miro para otro lado no pasaria nada, pero hay hay un problema y no se cual es.

Tambien he intentado usar HeapAlloc en vez de new para OpaquePointer pero cada vez que hago alguna operacion con str como el clear crashea, eso si me imagino que habra que personalizar un Allocator pero no estoy seguro de porque falla, solo es una suposicion.
#6
Pffff.... al fina que tonteria era, yo creia (habia leido) que los al quitar los privates en este tipo de situaciones no pasaba nada porque al cliente solo le interesa la interfaz por asi decirlo, pero no...

Lo que propone esta pagina su primera sugerencia lo tuve en mente a la hora del diseño de mi libreria, incluso tenia un diseño pensado para hacerle al usuario mas ameno todo en vez de tener que importar a mano la funciones que devuelvan los objetos, pero, pierdo la herencia entre clases de mi dll y clases del cliente que cree mi cliente heredando de la clases, eso no seria posible, ni tampoco casting a traves de constructores, cosas de las cuales no puedo prescindir segun las necesidades de mi problema en cuestion.

Lo primero que se me ocurrio al ver el problema, y conociendo las posivilidades que tengo es obtener el tamaño de la clase con sizeof y declarar en el (.h) del cliente como privado algo tal que:

Código (cpp) [Seleccionar]
private:
   char size[/*Aqui lo que devuelva sizeof*/];


Pero la verdad, es bastante chapucero, y tendria que tener cuidado, no es bueno trabajar con numeros magicos. La segunda opcion no la conocia, esta claro que es mi salvacion!! Pero haber entiendo que la parte que pone:
Código (cpp) [Seleccionar]
* : smile(new CheshireCat())

sea equivalente a poner:
Código (cpp) [Seleccionar]
smile = new CheshireCat();

como primera linea en el constructor de turno, pero esto:
Código (cpp) [Seleccionar]
: smile(new CheshireCat(*other.smile))

Es en el constructor copia, el compilador genera automaticamente un constructor copia para el struct?

Ante todo, muchisimas gracias Eternal Idol, no hubiera llegado yo solo a todas esas conclusiones por desconocimiento. Gracias
#7
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
#8
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?
#9
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
#10
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 (cpp) [Seleccionar]

class Miclase    //Obviamente exportado con __declspec (dllexport) en el caso de la dll
{
   private:
       string str;

   public:
       Miclase();
       ~Miclase();

};


(.cpp) en la dll:
Código (cpp) [Seleccionar]
Miclase::Miclase()
{
   str = string("prueba");
}

Miclase::~Miclase()
{
}


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

Código (cpp) [Seleccionar]
int main(int argc, char** argv)
{
   Miclase prueba[20];
   system("pause");

   return 0;
}


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 (cpp) [Seleccionar]
string str;
por este:
Código (cpp) [Seleccionar]
string *str;

y este:
Código (cpp) [Seleccionar]
str = string("prueba");
por este:
Código (cpp) [Seleccionar]
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?