c++ c linker gstreamer

c++ - ¿Cómo puede un cambio pequeño en un código que nunca se ejecuta hacer la diferencia?



linker gstreamer (4)

ES tu hilo usando myObj? De ser así, podría haber una condición de carrera entre establecer myObj en NULL y asignarlo de nuevo.

Tengo un problema muy extraño y dado que no me es posible enviar el código, intentaré explicarlo.

Esto es más como un problema filosófico. Espero que alguien tenga tiempo / conocimiento para pensar sobre esto.

1) Tengo project.cpp exactamente igual a esto:

#include <pthread.h> #include <unistd.h> pthread_t pplayer_thread; void *play(void*); int main(int argc, char **argv) { pthread_create(&pplayer_thread, NULL, play_cb, NULL); usleep(5000000); return 0; }

2) pplayer.cpp se ve algo así:

... void *play_cb(void *arg) { // this starts movie using gstreamer and exits thread } ...

3) not_executed _from_main.cpp buscando algo como esto:

... extern MyClass *myObj; // this is included from .h file ... MyClass *myObj = NULL; ... some_function() { ... myObj = MyClass::createNew(args); ... } ...

Todo esto está vinculado con otras bibliotecas y tonelada de basura, pero esto es básicamente lo que es importante.

-> Problema :

Cuando ejecuto esto, debería ver una ventana reproduciendo un clip de película usando gstreamer por 5 segundos -> ¡ PERO solo escucho sonido!

-> Cosa extraña :

Cuando comento la línea:

myObj = MyClass::createNew(args);

y correr de nuevo -> Veo la ventana de gstreamer también (todo está bien)

-> Notas :

esto puede tener algo que ver con:

  • proceso de vinculación y naturaleza de MyClass y su clase padre (mi mejor conjetura)
  • palabra clave "estática"
  • palabra clave "externa"
  • Mezcla C y C ++

-> Pregunto una vez más :

¿Cómo puede un cambio pequeño en un código que nunca se ejecuta hacer la diferencia?

(por favor ayuda)


dar su código de ejemplo no es el código real con el problema ....

main no es el único punto de entrada donde el código puede comenzar a ejecutarse, cualquier objeto global ejecutará sus constructores que pueden desencadenar todo tipo de código. Entonces tal vez de alguna manera te está mordiendo.

Puede depurarlo o, quizás, colocar mensajes en la consola para ver qué rutas se están ejecutando.


Lo más probable es que tenga que ver con . Tiene algo que hace algo malo, aborda las cosas fuera de límites o algún otro comportamiento indefinido y esto solo se desencadena (o no) en solo una configuración específica. Agregar o eliminar una declaración de variable puede ser tal.


Parece que necesitas familiarizarte con la teoría del caos . En un sistema suficientemente complejo, el más mínimo cambio puede propagarse a través de cualquier inestabilidad inherente hasta el punto de causar una gran diferencia.

En su caso, puede ser cualquier cosa, desde los efectos secundarios implícitos de ese método, hasta un error relacionado con la memoria que se hace visible cuando cambia el diseño del código ejecutable.

Debería usar un depurador para rastrear su código. Asegúrese de que no se ejecute realmente nada del código supuestamente no ejecutado. Su código puede estar ingresando rutas de código que erróneamente cree que son inaccesibles, o alguna otra parte de su programa (por ejemplo, un iniciador estático) puede estar actuando.

Valgrind también puede ser útil si está disponible para su plataforma: detectará una multitud de errores relacionados con la memoria, como el que sospecho que tiene en sus manos. Desafortunadamente, no es muy bueno para detectar errores en la pila; sin embargo, es posible que el compilador pueda ayudar.