生产服务器上的.net调试

生产服务器上的.net调试,.net,debugging,.net,Debugging,我和我的团队第一次在做一个.NETWeb应用程序项目。我们想知道在生产服务器上调试问题的最有效方法。目前,我们通过ftp将工作上传到客户端的生产服务器 因为我们的背景是LAMP,所以我们使用SSHing进入生产服务器,并使用die()、print_r()和注释输出技术的组合来解决问题 除非我误解了.net的工作方式,否则我不认为我可以使用相同的方法,因为对.net代码的更改需要完全重新构建项目(在本地主机上),然后上传。这太费时了 是否有更好的方法解决生产服务器上的问题?有多种不同的日志框架供您

我和我的团队第一次在做一个.NETWeb应用程序项目。我们想知道在生产服务器上调试问题的最有效方法。目前,我们通过ftp将工作上传到客户端的生产服务器

因为我们的背景是LAMP,所以我们使用SSHing进入生产服务器,并使用die()、print_r()和注释输出技术的组合来解决问题

除非我误解了.net的工作方式,否则我不认为我可以使用相同的方法,因为对.net代码的更改需要完全重新构建项目(在本地主机上),然后上传。这太费时了


是否有更好的方法解决生产服务器上的问题?

有多种不同的日志框架供您选择,您可以在不需要重建的情况下更改设置。您可以在配置文件中设置日志记录级别,例如错误、警告、调试等

在应用程序中包括所有日志记录级别的检测代码,这些日志语句只有在设置了日志级别时才会执行

下面是一个这样的例子


调试服务器端问题实际上只有三种方法

日志记录 提前计划并将日志添加到应用程序中。大多数日志框架,如log4net和enterprisebrary,都有根据配置设置记录更多或更少信息的模式。IIS也有自己的日志记录,您可以查看

仪器仪表 您可以向应用程序添加性能计数器,如果出现性能问题,还可以使用现有的性能计数器。另外,Sysinternals和WireShark提供的工具对于代码之外的问题也很方便

内存转储
您可以捕获应用程序的内存转储,并使用WinDbg等工具查看系统中发生的情况的快照。

在处理生产问题时,最好有一个复制生产的环境。在该环境中,您可以部署相同的应用程序,但启用了调试。这将允许您在生产中使用一整套您不想要的工具

一旦装备了这种环境,您所需要的就是找出异常发生的位置(通过日志记录/跟踪)以及如何重现问题

问题是生产环境的设计要快速(无需调试,日志记录最少)且安全。所以管理员讨厌调试,甚至讨厌远程调试的概念


设计良好的体系结构/生产软件的目标是收集有关出错原因的足够信息,以便您可以在另一个环境中重现错误/场景

在.NET中提供的堆栈跟踪,一旦您学会理解它们,通常会提供足够的值来真正跟踪错误。您可以启用远程调试,但由于它是客户端的机器,这是一个真正的麻烦,我会避免这种情况

大多数情况下,您要确保您有测试覆盖率,了解如何读取异常,并花一些时间思考您看到的异常。在10年的.NET工作中,我只想在一台生产服务器上调试一次,结果发现了错误,却没有


此外,还可以使用ELMAH捕获未处理的异常,这很有帮助

调试应在开发阶段启用“调试”选项时进行。部署到生产环境时,为了提高效率,请关闭“调试”选项。但是,在生产中,您可以将错误/异常/堆栈跟踪等记录在日志文件中,这将帮助您解决手头的问题


同样,那些die()、print_r()是perl调试方式,因为perl没有任何内置的异常或错误跟踪机制。这样在.NET中就不起作用了。

他们客户的系统管理员不会与我们合作,也不会为我们设置类似于生产的暂存环境。我的团队刚刚陷入了这一困境……我们没有预算开始扩充他们的web应用程序来进行正确的错误报告……我们正在寻找一种黑客方法来应用创可贴解决方案。这一切归结于你定义的正确错误处理?我非常确定,您所需要做的就是跟踪异常发生的位置,并找到一种审核数据的方法,以便知道是什么事件/消息触发了崩溃。在您刚才解释的环境中,我想在权限/服务器访问/调试方面,您比大多数人都有更多的自由。有了对导致崩溃的数据的了解,您可以随时提取所需数据并在本地运行。没有异常,代码运行良好。但程序流的运行方式出乎意料。不管怎样,威尔会一直想办法找出到底发生了什么。