只有在 Visual Studio 之外运行 EXE 时才会出现发布错误
Posted
技术标签:
【中文标题】只有在 Visual Studio 之外运行 EXE 时才会出现发布错误【英文标题】:Release bugs only show up when running EXE outside of Visual Studio 【发布时间】:2013-10-03 02:10:18 【问题描述】:我正在尝试调试一个问题,该问题仅在我运行直接在 Visual Studio 外部构建的发布 exe 时发生。当我在 Visual Studio 中执行它时,即使使用特定的项目属性来调试“发布”版本(例如打开优化),程序也会正常运行,如下页所述。
http://msdn.microsoft.com/en-us/library/fsk896zz%28v=vs.100%29.aspx
我在使用这些设置和使用 VS 运行/调试时没有遇到任何问题,但是当我将 exe 和所需文件(图像和一些 dll)复制到它自己的目录并直接运行 exe 而不是通过 VS2010 运行时,我遇到了一些问题错误。这使得调试变得困难,因为无论我使用什么设置,我都无法在 VS 中出现问题。
我是否遗漏了一些设置,还是在 VS2010 之外发生了更多我无法在 VS 2010 中模拟的不同情况?
我没有使用任何可能影响它的参数或环境变量,并且工作目录中的文件结构与源代码目录中的相同。
编辑: 通过使用此处的信息附加到 exe 找到错误(未初始化的变量): Release build changes behavior when run outside of the debugger
【问题讨论】:
你逃避的“几个错误”可能很能说明问题。也许包括那些。 把__debugbreak();
放到你的 main() 函数中。
只是为了确认一下:您的常规版本构建开启了所有优化,对吗? (通过尝试调试发布版本,您通常会添加调试符号并降低编译器优化)您看到什么样的错误?致命的?
@Raja 我的发布版本将引用和启用 COMDAT 折叠设置为是。不知道还有什么。我只是遇到一些错误,例如应该销毁的图像仍留在屏幕上。并没有什么实际崩溃或任何东西。
【参考方案1】:
Visual C++ 的调试器可以附加到已经运行的进程。 (调试-> 附加到进程。)您可以尝试使用它在 Visual Studio 之外启动您的 exe,然后附加到它并调试错误。作为执行此操作的另一种方法,正如@Hans Passant 建议的那样,您还可以将__debugbreak();
添加到您的进程中,以强制 Windows 在您运行它时提供调试提示并以这种方式附加 Visual Studio 调试器。
我很想使用Process Monitor 来比较调试器内外的 exe 执行情况,看看它们在文件访问、DLL 加载等方面是否真的在做同样的事情。
有关类似问题,请参阅 this question。
【讨论】:
原因是一个未初始化的变量。我发现它是由于您附加到该过程的解决方案。奇怪的是,从 VS 内部运行时变量将如何初始化,即使您打开了优化。我忘了我可以附加到调试的过程中。谢谢。【参考方案2】:两个念头立刻浮现在脑海: - 未初始化的变量 - 比赛条件。查看您的线程模型,并考虑锁定关键部分或变量访问。
【讨论】:
以上是关于只有在 Visual Studio 之外运行 EXE 时才会出现发布错误的主要内容,如果未能解决你的问题,请参考以下文章