Visual Studio – 调试与发布

我在VS 2008中构建了一个针对.NET 2.0的Windows服务。我将其作为控制台应用程序运行以进行调试。

控制台应用程序运行良好。 我把它放在我的本地计算机上作为服务,在调试模式下编译,仍然工作得很好。 我现在准备发布了,突然,当我将其设置为发布模式时,服务编译并安装,但没有任何反应。 (根本没有运行中的代码)。

我意识到发布与调试模式是属性配置设置,但似乎在发布模式下,即使我检查定义DEBUG常量,取消选中Optimize代码,并将Debug info设置为’full’,它仍然无效。

将它重新设置为调试,它再次像魅力一样工作。

(作为旁注,我尝试将目标框架重置为3.5,以确保不是问题)

所以我的问题(按重要性排序)是这些:

  1. 将以任何方式使用我的“调试”版本会导致任何问题吗?

  2. 除了我已经尝试改变的三个设置之外,调试和发布之间的设置有何不同?

  3. 这对我来说似乎是一个奇怪的错误,并激起了我的好奇心。 知道是什么会导致这个吗?

编辑:应该提一下,我已经在使用自定义安装程序。 基本上我编译程序(在调试或发布中),然后使用相应的安装程序安装它。

1)如果不是直接的话,它可能通过使应用程序变慢并使其使用更多内存来间接地进行。

2)当它在调试模式下运行时,某些东西的工作方式不同,例如:

  • 代码使用一些额外的NOP指令进行编译,因此在每个代码行的开头至少有一条指令,这样就可以在任何一行放置一个断点。

  • 指令可以在发布模式下重新排列,但不能在调试模式下重新排列,因此代码可以单步执行,结果将对应于源代码的确切顺序。

  • 垃圾收集器的工作方式不同,它允许引用在整个范围内存活,而不是仅在它们被使用的时间内存在,这样变量可以在调试模式下查看,而不会在范围结束之前消失。

  • exception包含更多信息,并且在抛出时需要花费更长的时间来处理。

所有这些差异都相对较小,但它们是实际差异,在某些情况下它们可能很重要。

如果您发现调试模式和发布模式之间的性能差异很大,通常是因为代码存在问题,例如,如果它抛出并捕获大量exception。 如果代码中存在竞争条件,则它可能仅在发布模式下发生,因为调试模式中存在一些额外开销会导致代码运行稍慢。

3)至于你的服务有什么问题,我不知道,但它似乎与在调试模式或发布模式下如何执行代码无关。 代码将在任何情况下启动,如果它是代码的问题,它将崩溃,您将能够在事件日志中看到它。

我不确定我能说#1还是#2,但是当我遇到这样的问题时,那是因为线程/并发不正确 。 我不确定你的应用程序有多大,但这可能是一个很好的起点。