为什么不通过调试器运行关键业务C#控制台应用程序?
我正在寻找一些谈话要点,我可以用来说服同事,仅打开Visual Studio并在调试模式下运行该应用程序就无法运行24/7生产应用程序。
与在调试模式下运行同一控制台应用程序相比,运行已编译控制台应用程序有何不同?
我们是否曾经在实时设置中使用调试器? (实时:表示已连接到面向客户的数据库)
我是否认为通过调试器运行实时配置总是一个坏主意,这是错误的吗?
解决方案
我不能代表每个人的经历,但是对我来说,Visual Studio崩溃很多。它不仅使其崩溃,而且使资源管理器崩溃。插件和插件会加剧这种情况。我不确定它是否经过测试可以连续24/7天和几天又几天地以与操作系统相同的方式运行。
我们实质上是将应用程序的运行置于第二个应用程序的庞然大物的摆布之下,听起来像它的数量级比应用程序容易且复杂。我们将只获得错误报告,并且其中大多数将涉及Visual Studio崩溃。
另外,我们是否要为生产机器支付Visual Studio许可证?
在调试器下运行时,性能会降低(更不用说Bruce提到的复杂性问题了),并且没有什么可以阻止我们在发布模式下进行编译时获得与在调试器下运行相同的功能-我们可以随时进行设置程序可以记录未处理的异常并生成核心转储,即使重新启动应用程序之后,该核心转储也可以使我们调试问题。
此外,手动管理需要24/7可用性的应用程序听起来完全是错误的。我们应该使用计划的任务或者某种自动的流程重启机制。
退后一步,这个问题可能会提供一些影响团队的指导。
我们从不通过调试器运行它。有些编译器选项可能会意外打开/关闭。没有启用优化,并且在生产中运行它会带来巨大的安全风险。
概括地说,当我们在调试器下运行程序时,实际上是在运行目标和调试器这两个进程,并将它们紧密地联系在一起。因此,存在意料之外的影响和错误(不在生产过程中)的机会。当然,编写调试器的人员会尽力将这些影响降到最低,但是以24/7运行该方案很可能会暴露确实存在的任何问题。
如果我们要查找特定的故障,则有时在调试器下运行是最好的解决方案。但是即使在那儿,经常启用一种或者另一种跟踪也是一种影响较小的解决方案,并且同样有效。
调试器还会根据计算机和应用程序消耗资源,这可能是一个问题。如果我们需要使用调试器24/7可能会出错的更具体的示例,请告诉我。
无论性能问题如何,我们绝对不希望从调试器手动运行需要运行24/7的应用程序。如果我们必须说服同事,那就找一份新工作。
在无法在测试环境中准确复制生产数据的情况下,有时我会使用实时调试器(即针对实时客户数据)来调试与数据相关的应用程序问题。
就其本身而言,如果性能足够好,则在调试中运行它就没有问题。让我感到奇怪的是,我们正在以用户身份运行关键业务24/7应用程序,甚至在工作站上也是如此。如果要确保健壮性和可用性,则应考虑在专用硬件上运行此程序,除了该应用程序外没有人使用。如果确实是在用户计算机上运行此程序,则很容易发生事故,例如关闭"错误的" Visual Studio或者使计算机崩溃等。
在调试中运行应在测试环境中完成。在我工作过的地方,我们通常有三个环境,生产,发布和测试。
生产
- 专用五金
- 访问受限,通常只有主要的开发人员/技术
- 版本控制,来自SVN / CVS的特定标记版本
- 运行已升级为生产状态的最新稳定版本
释放
- 专用硬件
- 对所有开发人员都有完全访问权限
- 版本控制,来自SVN / CVS的特定标记版本
- 运行产品的下一个版本,但尚未升级为生产状态,但可能会升级。如果我们愿意,可以使用"黄金"。
测试
- 虚拟机或者虱子硬件
- 完全访问
- 没有版本控制,可能是下一个,下一个版本,也可能只是某个人想要在"临近的产品环境"中测试的自定义版本
这样,我们可以轻松地测试Release中的新版本,甚至可以在那里进行调试。在测试环境中,一切皆有可能。如果有人要测试涉及多个盒子(我们自己的盒子)的东西,那就更好了。
通过这种方式,它可以保护我们免受那些没有通过专用测试机进行足够测试的快速黑客攻击,但仍然可以让我们在紧急情况下释放这些黑客攻击。
除了可能具有不同代码路径(#ifdef,Debug.Assert()等)的调试代码以外,它还将运行相同的代码。
设置断点,设置要执行的下一行代码,弹出式交互式异常以及在Visual Studio下运行不稳定的情况时,我们都有些担心,还有一些调试器选项可让我们始终在发生异常时中断。如果我们没有正确编写代码,即使检查类也可能会产生副作用。这肯定不是我想要做的正常的24x7流程。
从调试器运行的唯一原因是调试应用程序。如果我们在生产中定期执行此操作,那么代码和流程就需要帮助,这是一个很大的危险信号。
迄今为止,我从未在生产环境中交互式地运行过调试模式。难得的时间,我们切换到调试版本进行额外的日志记录,但从未在Visual Studio打开的情况下呆在那里。
简单的答案:我们几乎肯定会降低性能(很可能会大大降低),并且会大大增加依赖性。在第一步中,我们已将整个VS堆栈(包括IDE以及所有其他内容)添加到依赖项中。聪明的人尽可能地保持对高正常运行时间服务的依赖性。
如果要在调试器下运行,则应使用重量较轻的调试器,例如ntsd,这很疯狂。
我会问他们通过Visual Studio运行它的好处是什么?
答复中列出了很多缺点。我想不出任何优势。
询问他们是否希望在The Daily WTF上被公众嘲笑。 (因为在写作中有足够的细节,这将是合格的。)