trucos segmentar segmentación segmentacion mercado intereses generado como abortado c++ segmentation-fault exit-code

c++ - segmentar - falla de segmentación en__tcf_0 cuando el programa sale



segmentación twitter (1)

El problema esta resuelto. Hay una colisión de nombre de variable global en los archivos de encabezado de origen y tlm de libkmm.so.2.0.0.

Parece que "l __tcf_0" no muestra la variable correcta. Gracias Alex, maverik, Iulian Şerbănoiu y otros leyendo esta pregunta.

cuando el programa sale, se da la información:

*** glibc detected *** double free or corruption (!prev): 0x09a8fcb8 ***

Parece doblemente gratis en un objeto. Luego usé gdb para depurar el archivo coredump. El siguiente es el resultado de bt (no se publican más trazas):

#0 0x005197a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2 #1 0x0055a825 in raise () from /lib/tls/libc.so.6 #2 0x0055c289 in abort () from /lib/tls/libc.so.6 #3 0x0058ecda in __libc_message () from /lib/tls/libc.so.6 #4 0x0059556f in _int_free () from /lib/tls/libc.so.6 #5 0x0059594a in free () from /lib/tls/libc.so.6 #6 0x00c0f001 in operator delete (ptr=0x0) at ../../../../gcc-4.2.2/libstdc++-v3/libsupc++/del_op.cc:49 #7 0x00bea48d in std::string::_Rep::_M_destroy (this=0x9a8fcb8, __a=@0xbfe134af) at /home/robert_bu/src/build_gcc-4.2.2/i686-pc-linux-gnu/libstdc++-v3/include/ext/new_allocator.h:97 #8 0x070807e8 in __tcf_0 () from ./../bin/../lib/librlxvm_kmmpv_ocp_tl2.so #9 0x0055d5a7 in exit () from /lib/tls/libc.so.6 ...

Luego, el resultado valgrind me muestra que la cadena es eliminada por dos archivos .so diferentes (libkmm.so.2.0.0 y libpv.so.2.0.0). Información detallada (algunas líneas están enmascaradas):

==28125== Invalid free() / delete / delete[] ==28125== at 0x400588F: operator delete(void*) (vg_replace_malloc.c:387) ==28125== by 0x446548C: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:97) ==28125== by 0x55FA7E7: __tcf_0 (in /home/alan_tao/vm/test/lib/libkmm.so.2.0.0) ==28125== by 0x55D5A6: exit (in /lib/tls/libc-2.3.4.so) ==28125== by 0x42B10D9: stop_sim() (in /home/alan_tao/vm/test/lib/libcomm.so.2.0.0) ==28125== by 0x807C83A: func_on_exit(int) (in /home/alan_tao/vm/test/bin/engine) ==28125== by 0x55A917: ??? (in /lib/tls/libc-2.3.4.so) ... ==28125== Address 0x4a484d0 is 0 bytes inside a block of size 525 free''d ==28125== at 0x400588F: operator delete(void*) (vg_replace_malloc.c:387) ==28125== by 0x446548C: std::string::_Rep::_M_destroy(std::allocator<char> const&) new_allocator.h:97) ==28125== by 0x650C0B7: __tcf_0 (in /home/alan_tao/vm/test/lib/libpv.so.2.0.0) ==28125== by 0x55D5A6: exit (in /lib/tls/libc-2.3.4.so) ==28125== by 0x42B10D9: stop_sim() (in /home/alan_tao/vm/test/lib/libcomm.so.2.0.0) ==28125== by 0x807C83A: func_on_exit(int) (in /home/alan_tao/vm/test/bin/engine) ==28125== by 0x55A917: ??? (in /lib/tls/libc-2.3.4.so)

...

El resultado valgrind muestra que una cadena se elimina dos veces. Pero no puedo saber cuál es la estática correcta. ¿Quién tiene idea de saber eliminar qué cadena causa el error y cómo solucionarlo? Gracias

PD: el programa se ejecuta bajo linux 2.6.9. la versión de gcc es 4.2.2. dll es usado.

Nueva actualización: Usando gdb para listar el archivo error lib, el comando "l __tcf_0" me muestra el siguiente código:

inline std::vector<const char*>& get_phase_name_vec(){ static std::vector<const char*> phase_name_vec(END_RESP+1, (const char*)NULL); return phase_name_vec; }

Esto es del archivo de encabezado OSCI TLM. Y las bibliotecas anteriores deben incluirlas. Está en un espacio de nombres separado "tlm". Alguna idea para arreglar este error?