我使用 freeglut、optix、cuda 和其他库(其中一些是动态加载的)编译了一个程序。它在 Visual Studio 中编译和运行没有问题,但如果我在 Visual Studio 之外执行它会崩溃。发布和调试版本都在 VS 中工作,如果我尝试直接执行它们,它们都会在没有任何 Windows 8 信息的情况下崩溃。
我已经包含了所有必要的 DLL,但没有用。
可能是什么问题呢?
我使用 freeglut、optix、cuda 和其他库(其中一些是动态加载的)编译了一个程序。它在 Visual Studio 中编译和运行没有问题,但如果我在 Visual Studio 之外执行它会崩溃。发布和调试版本都在 VS 中工作,如果我尝试直接执行它们,它们都会在没有任何 Windows 8 信息的情况下崩溃。
我已经包含了所有必要的 DLL,但没有用。
可能是什么问题呢?
大多数这样的观察通常来自未定义的行为——使用未初始化的变量、悬空指针/引用、溢出缓冲区。
您可以尝试使用应用程序验证程序,如果运气好的话,它可能会重新排列已使用的内存,足以让您在调试下触发问题以帮助解决问题。
此外,当它崩溃时,您应该得到启动 VS 并检查问题的提示——它不是表示提示吗?崩溃的直接原因是什么?你在调用堆栈上有什么?
You can try comparing the environments between visual studio and the default environment.
Dependency walker should identify any missing DLLs.
Visual Studio 在“调试”模式下运行可执行文件,这意味着存在调试器。
这是什么意思?如果您检查 msvcrt 实现,如果运行时检测到存在调试器 (IsDebuggerPresent),那么堆会以不同的方式执行。
这是什么意思?这意味着缓冲区大小被向上“轻推”,这意味着内存分配在默认情况下被清除干净(不需要 memset)等。
这可能会导致出现各种错误,或者隐藏一些更微妙的错误。