如何从未执行的代码中进行小的更改会产生影响?

kli*_*eta 7 c c++ linker gstreamer

我有一个非常奇怪的问题,因为我不可能发送代码,我会尝试解释.

这更像是哲学问题 - 我希望有人有时间/知识来思考这个问题.

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;
}
Run Code Online (Sandbox Code Playgroud)

2)pplayer.cpp看起来像这样:

...
void *play_cb(void *arg) {
    // this starts movie using gstreamer and exits thread
}   
...
Run Code Online (Sandbox Code Playgroud)

3)not_executed _from_main.cpp看起来像这样:

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

这些都与各种其他图书馆和大量垃圾联系在一起,但这基本上是重要的.

- > 问题:

当我运行它时,我应该看到窗口使用gstreamer播放影片剪辑5秒钟 - > 但我只听到声音!

- > 奇怪的事:

当我评论这条线时:

myObj = MyClass::createNew(args);
Run Code Online (Sandbox Code Playgroud)

并再次运行 - >我也看到gstreamer窗口(一切都很好)

- > 注意事项:

这可能与以下内容有关:

  • 链接MyClass的过程性质以及它的父类(我最好的猜测)
  • "静态"关键字
  • "外部"关键字
  • C和C++混合

- > 我再问一次:

如何从未执行的代码中进行小的更改会产生影响?

(请帮忙)

thk*_*ala 7

好像你需要熟悉混沌理论.在一个足够复杂的系统中,最微小的变化可以通过任何固有的不稳定性传播到引起巨大差异的程度.

在您的情况下,它可以是从该方法的隐式副作用到可执行代码的布局发生变化时可见的与内存相关的错误.

您应该使用调试器来跟踪代码.确保实际执行的所谓未执行代码中没有任何内容.您的代码可能正在输入您错误认为无法访问的代码路径,或者您的程序的某些其他部分(例如静态初始化程序)可能正在执行.

如果适用于您的平台,Valgrind也会很有用 - 它会检测到大量与内存相关的错误,例如我怀疑您手中的错误.不幸的是,它不是很好地检测堆栈中的错误 - 但是编译器可能能够帮助那里.


Jen*_*edt 3

最有可能的是它与 stackoverflow 有关。你有一些东西做了一些坏事,解决了越界的问题或一些其他未定义的行为,并且这只在某些特定的配置中触发(或不触发)。添加或删除变量声明就是这样的事情。