【问题标题】:Visual Studio - Debug vs ReleaseVisual Studio - 调试与发布
【发布时间】:2011-03-09 18:22:32
【问题描述】:

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

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

我意识到发布与调试模式是属性配置设置,但似乎在发布模式下,即使我选中定义调试常量,取消选中优化代码,并将调试信息设置为“完整”,它仍然什么都不做.

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

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

所以我的问题(按重要性排序)如下:

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

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

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

编辑: 应该提一下,我已经在使用自定义安装程序。基本上我会编译程序(无论是调试还是发布),然后使用相应的安装程序进行安装。

【问题讨论】:

  • 您确定在发布模式下该服务正在安装(并且安装正确)?
  • 您需要为您的 Windows 服务安装安装程序和自定义操作。更多信息:msdn.microsoft.com/en-us/library/d56de412(VS.80).aspx
  • 服务是否进入Running状态?事件日志中的任何内容?
  • @Robert Harvey:我有一个安装程序。我所做的是在“调试”模式下构建项目,然后我使用创建的安装程序将服务安装到我的本地机器。然后我使用 services.msc 来停止、启动和重新启动。 @Josh E:鉴于我每次都以相同的方式安装它,无论我如何编译它,我都看不出哪里出错了? @Stephen Cleary:我可以访问事件查看器,但不确定我在寻找什么?
  • 使用System.ServiceProcess.ServiceBase.EventLog 实例在您的服务启动时将消息写入事件查看器。例如,在OnStart() 回调中,写一条消息表明你至少已经做到了。这将帮助您缩小问题发生的范围。很有可能,您的服务正在触发将其关闭的异常。如果是这样,在您的服务的Main() 函数中放置一个 try-catch 块,并在包含堆栈跟踪的 catch 块中向事件查看器写入一条消息,将准确地显示问题发生的位置。

标签: c# visual-studio windows-services properties release


【解决方案1】:

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

2) 当它在调试模式下运行时,有些事情会有所不同,例如:

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

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

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

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

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

如果您发现调试模式和发布模式之间的性能差异很大,这通常是因为代码存在问题,例如,如果它正在抛出和捕获大量异常。如果代码中存在竞态条件,它可能只会在发布模式下发生,因为在调试模式下会有一些额外的开销,这会使代码运行得稍微慢一些。

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

【讨论】:

  • 谢谢,它似乎完美无缺,我只是继续以这种方式部署它。我仍然很困惑发生了什么,但是是的,这不是代码。再次感谢。 :)
【解决方案2】:

我不确定我能否与 #1 或 #2 交谈,但当我遇到此类问题时,那是因为线程/并发性不正确。我不确定您的应用有多大,但这可能是一个不错的起点。

【讨论】:

  • 乍得,虽然这些总是有可能是 OP 的有效问题,但我认为这些可能不是问题; 更多可能是配置/安装问题
  • 它很小,基本上是一个计时器,它在更新时调用一个函数。我很确定线程安全不是因为发布模式不起作用,它甚至不运行构造函数,而使用调试设置编译它可以完美地工作。不过一般来说是合理的建议,谢谢。 :)
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 2016-12-14
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多