Pregunta

Estoy escribiendo una biblioteca de programación basada en eventos para usar en BeagleBone Black y encontré un error extraño.

Cuando compilo exactamente el mismo código con exactamente los mismos indicadores, recibo los siguientes errores en el procesador basado en ARM, pero no cuando ejecuto el código compilado para mi computadora x86.

$ ./missionControl
pure virtual method called
pure virtual method called
pure virtual method called
terminate called recursively
terminate called recursively
Aborted

Cuando compilo y ejecuto en mi computadora portátil, el el programa se ejecuta correctamente.

Este es el comando que estoy usando para compilar (más o menos, estoy usando un Makefile, pero ambos métodos de compilación exhiben precisamente el mismo comportamiento):

g++ -std=gnu++11 -pthread -O3 -D_GLIBCXX_USE_NANOSLEEP -o missionControl `find . -name *.cpp`

No importa si hago una compilación cruzada con Ubuntu arm-linux-gnueabi-g++ o el compatible con ARM g++ En el BeagleBone real, sigo recibiendo errores en ARM.

Mi pregunta es esta:¿Qué podría estar causando este error y qué puedo hacer para intentar encontrar la fuente?¿Por qué sucedería esto en una arquitectura de procesador, pero no en otra, para la misma versión de G++?

¡Gracias!

Aquí hay un rastreo del GDB del procesador ARM:

#0  0xb6d4adf8 in raise () from /lib/libc.so.6
#1  0xb6d4e870 in abort () from /lib/libc.so.6
#2  0xb6f50ab4 in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/libstdc++.so.6
#3  0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
#4  0xb6f4ea4c in ?? () from /usr/lib/libstdc++.so.6
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
¿Fue útil?

Solución

El problema resultó ser debido a un error en la versión ARM de libstdc++ que se ejecuta en BeagleBone.Un pequeño programa de juguete que no tiene ninguna función virtual causa el mismo error ("se llama a una función virtual pura") cuando se crea std::thread.

Voy a intentar compilar una versión personalizada de gcc/libstdc++ 4.8 en el propio BeagleBone, incluso si lleva mucho tiempo.

Otros consejos

El método virtual puro llamado El error ocurre cuando intenta utilizar el envío dinámico para llamar a una función que es puramente virtual en una base antes de que se haya construido el tipo derivado que la implementa o después de que ya se haya destruido.

La causa más común de esto es si la clase base intenta llamar a una función virtual que es pura en este nivel a través del constructor o destructor.Aparte de eso, como se señaló en algunos comentarios, si intentas acceder a un objeto inactivo, también puedes encontrarte con el mismo problema.

Simplemente conecte un depurador al programa y vea qué función virtual se llama y desde dónde.

Ver: https://groups.google.com/forum/#!topic/automatak-dnp3/Jisp_zGhd5I

Y: ¿Por qué falla este simple ejemplo de subprocesamiento de C++11 cuando se compila con clang 3.2?

Ahora, no tengo idea de por qué esto funciona, pero al menos a mí me funciona.Agregue las siguientes cuatro definiciones de preprocesador a la línea de comando del compilador:

__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8

No he experimentado para ver si todos son necesarios, o si puedes salirte con la tuya solo con algunos.Pero esto me solucionó el problema.Gracias a quienes escribieron las respuestas anteriores y gracias a mi colega por buscarme en Google :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top