只有在 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 时才会出现发布错误的主要内容,如果未能解决你的问题,请参考以下文章

程序在 Visual Studio 之外运行时表现不同

程序在 Visual Studio 之外无法运行

在 Visual Studio 之外启动时程序运行速度较慢

WPF 应用程序在 Visual Studio 之外崩溃

如何在 Visual Studio 之外使用 Package Manager Console powershell

求助visual studio 2010 生成失败