Как может небольшое изменение в коде, который никогда не выполняется, иметь значение? - PullRequest
7 голосов
/ 25 января 2012

У меня очень странная проблема , и поскольку я не могу отправить код, я попытаюсь объяснить.

Это больше похоже на философскую проблему - я надеюсь, что у кого-то есть время/ знание, чтобы думать об этом.

1) У меня project.cpp выглядит примерно так:

#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 выглядит примерно так:

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

3) not_executed _from_main.cpp выглядит примерно так:

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

Все это связано с различными другими библиотеками и кучей мусора, но это в основном то, что важно.

-> Задача :

При запуске этого окна я должен увидеть окно воспроизведения видеоклипа с использованием gstreamer в течение 5 секунд -> НО я слышу толькозвук!

-> Странная вещь :

Когда я комментирую строку:

myObj = MyClass::createNew(args);

и запускаю снова ->Я также вижу окно gstreamer (все в порядке)

-> Примечания :

это может быть как-то связано с:

  • процесс связывания и природа MyClass и его родительского класса (мои лучшие предположения)
  • "статическое" ключевое слово
  • "внешнее" ключевое слово
  • C и C ++ смешивание

-> Еще раз спрашиваю :

Какможет ли небольшое изменение в коде, который никогда не выполняется, иметь значение?

(пожалуйста, помогите)

Ответы [ 4 ]

7 голосов
/ 25 января 2012

Похоже, вам нужно ознакомиться с теорией хаоса .В достаточно сложной системе малейшее изменение может распространяться через любую врожденную нестабильность до такой степени, что может вызвать существенную разницу.

В вашем случае это может быть что угодно, от неявных побочных эффектов этого метода до памятисвязанная с этим ошибка становится видимой при изменении компоновки исполняемого кода.

Вы должны использовать отладчик для отслеживания вашего кода.Убедитесь, что ничего из предположительно не выполненного кода действительно выполняется.Ваш код может вводить пути кода, которые вы по ошибке считаете недоступными, или какая-то другая часть вашей программы (например, статический инициализатор) может работать.

Valgrind также может быть полезным, еслион доступен для вашей платформы - он обнаружит множество ошибок, связанных с памятью, как, я подозреваю, у вас под рукой.К сожалению, он не очень хорош в обнаружении ошибок в стеке - ваш компилятор может помочь в этом.

3 голосов
/ 25 января 2012

Скорее всего, это связано с stackoverflow. У вас есть что-то, что делает что-то плохое, обращаясь к вещам вне пределов или к другому неопределенному поведению, и это срабатывает (или не срабатывает) только в определенной конфигурации. Добавление или удаление объявления переменной может быть такой вещью.

2 голосов
/ 25 января 2012

приведите ваш пример кода не является реальным кодом с проблемой ....

main не единственная точка входа, где код может начать выполняться, любые глобальные объекты будут выполнять свои конструкторы, которые могут запускать всевиды кода.Так что, возможно, именно так вас и кусают.

Либо отладьте его, либо, возможно, отправьте сообщения на консоль, чтобы посмотреть, какие пути выполняются.

0 голосов
/ 25 января 2012

Ваша тема использует myObj?В этом случае может возникнуть условие гонки между установкой myObj в значение NULL и его повторным выделением.

...