2012-01-25 11 views
7

Tengo problema muy extraño y como no me es posible enviar el código, intentaré explicarlo.¿Cómo puede un cambio pequeño en un código que nunca se ejecuta hacer la diferencia?

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

1) He project.cpp se ve exactamente como 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 buscando algo como esto:

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

3) not_executed _from_main.cpp buscando algo como este:

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

Esto es todo linke d junto con varias otras bibliotecas y tonelada de basura, pero esto es básicamente lo que es importante.

-> Problema :

Cuando ejecuto esto, yo debería ver la ventana jugando clip de película usando GStreamer durante 5 segundos ->pero sólo escuchar el sonido!

->Lo extraño:

cuando comento la línea:

myObj = MyClass::createNew(args); 

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

->Notas:

esto puede tener algo que ver con:

  • proceso de vinculación y naturaleza de MiClase y es la clase padre (mi mejor conjetura)
  • palabra clave "estática"
  • palabra clave "externa"
  • C y C++ mezclando

->te pido 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)

+1

Problemas de memoria probables, verifique con valgrind – academicRobot

+1

Intente ejecutar el programa bajo valgrind y vea si hay stackoverflows/leaks de memoria/double frees/. – orlp

+0

No debería haber diferencia. Pero parece que tu 'not_executed_from_main.cpp' está marcando una diferencia de la que no eres consciente. ¿Podría mostrarnos más de este archivo .cpp y .h? –

Respuesta

3

Lo más probable es que tiene que ver con stackoverflow. 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.

+0

+1 Agregar ese código al binario cambiaría el código que está siendo golpeado por el stackoverflow. Pensé que el código estaba protegido contra los datos que se desbordaban en él, pero dudo que sea 100%. – John

7

Parece que necesita familiarizarse con chaos theory. 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.

Debe usar un depurador para rastrear su código. Asegúrese de que no se ejecute realmente nada del código supuestamente no ejecutado. Es posible que su código esté ingresando rutas de código que erróneamente cree que son inaccesibles, o que alguna otra parte de su programa (por ejemplo, un iniciador estático) pueda 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.

+0

Sensibilidad a las condiciones iniciales, excelente! – academicRobot

2

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

principal no es el único punto de entrada donde el código puede comenzar a ejecutar, los objetos globales 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.

+0

Sí, también lo comprobé (tal vez no tan bien como debería) pero estoy seguro de que el código * nunca * llega a esta línea, por lo que incluso si el programa ingresa en algunos constructores (¡y lo hace!), Todavía no lo hago t get this ... – kliketa

+0

puede haber todo tipo de cosas raras que suceden si tienes problemas de enlaces extraños, problemas de memoria, etc. No es divertido de encontrar ... ahora si esa línea de código no se ejecuta, es probable que sea un problema de memoria, intente poner una llamada de función diferente allí a otra cosa quizás. –

0

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

+0

lo siento, no lo hace – kliketa

Cuestiones relacionadas