1. 概述
常见的几种运行时问题包括 错误数据、慢于预期的响应、未知行为 或者 未处理的异常。
Visual Studio 提供了 排查、跟踪 和 日志 等工具 来帮助排查系统的问题。有些情况还需要插入诊断代码。
本章内容包括:排查性能、安全问题和运行时错误, 实现跟踪、日志(包括使用attributes) 和 调试(包括 IntelliTrace),使用代码契约来加强条件验证,启用和配置健康监视。
2. 主要内容
2.1 排查性能问题、安全问题和运行时错误
性能问题会让用户有挫败感
安全问题可能会导致一切的问题,包括内部和外部的,如果用户的数据受到安全威胁的话。
运行时错误会影响所有,包括 表现、安全 和 生成不正确的数据。
2.1.1 使用性能向导(Performance Wizard)
VS2012提供的性能向导,是一个性能分析工具。
包含 CPU sampling、Instrumentation、.NET memory allocation (sampling) 和 Resource contention data (concurrency)。
CPU sampling: 是一种轻量级的监测,更多的用于初始检查,提供进一步系统检查的方向。
Instrumentation:方法调用的计数和时间。是一种更加侵入性的过程,性能工具会添加监测代码到组件中。
.NET memory allocation (sampling): 监测内存分配。分析每一个对象从被创建到被回收的过程。
Resource contention data (con-currency):用于多线程程序。提供线程交互信息以及线程与系统交互的信息。
2.1.2 使用 Visual Studio Profiler
Visual Studio 提供了一个 Profiler,提供了对系统中调用操作的完成跟踪信息。
相对于性能监测工具对性能的关注,Visual Studio Profiler 主要监测活动并且记录它们。这种详细的数据,可以用来做更深入的分析。
这个图标展示了每秒钟Cpu的使用情况。
2.1.3 使用 性能监测器(Performance Monitor)
性能监测器是 Windows Server 提供的工具,可用于在生产环境监测程序。
2.2 排查安全问题
一般来说,安全问题都与 身份验证 和 授权访问 有关。
身份验证问题,需要考虑验证问题的范围,是 所有用户、特定的一个用户 还是 一组用户。
授权访问问题,也是类似的思路。根据范围确定问题可能发生的原因。
2.3 实现 跟踪、日志 以及 调试
跟踪 是一种 可以在程序运行时进行分析的技术。 .net內建了对跟踪的支持。
Trace.WriteIf(someValueIsTrue, “Message”).
日志 是记录信息的过程。NLog 和 log4net 是两种常用的开源日志工具。
可以使用try-catch手动处理 调试、错误 和 跟踪信息,也可以通过使用 HandleErrorAttribute 来自动处理。
HandleErrorAttribute 可用于 actions, controllers, 或者 globally。
[HandleError(ExceptionType=typeof(System.IOException),View="FileError")]
protected override void OnException(ExceptionContext exceptionContext) { if (exceptionContext.IsChildAction) { //we don‘t want to display the error screen if it is a child action, base.OnException(exceptionContext); return; } // log the exception in your configured logger Logger.Log(exceptionContext.Exception); //handle when the app is not configured to use the custom error path if (!exceptionContext.HttpContext.IsCustomErrorEnabled) { exceptionContext.ExceptionHandled = true; this.View("ErrorManager").ExecuteResult(this.ControllerContext); } }
2.4 使用代码契约来加强条件验证
代码契约在.net4.0中引入,允许开发者在程序中加入限制条件。包括三种类型:
a. Preconditions 方法执行前,验证输入的条件。
b. Invariants 方法执行过程中,防止出现非法的状态。
c. Postconditions 方法完成时,检查要输出的结果。
使用代码契约需要一种不同的方式去管理异常处理流程。
internal Article GetArticle(int id) { System.Diagnostics.Contracts.Contract.Requires(id > 0); // some work here }
Invariant检查用于确保类中不会出现非法的状态。
[ContractInvariantMethod] protected void ManageInvariant() { System.Diagnostics.Contract.Invariant(this.Id < 0); }
Postconditions
internal Article GetArticle(int id) { System.Diagnostics.Contracts.Contract.Requires(id > 0); System.Diagnostics.Contracts.Contract.Ensures( Contract.Results<Article>() != null); // some work here }
还可以用其他方式处理违反合约的情况,可以通过注册 Contract.ContractFailed 事件,来添加自定义的处理逻辑。
2.5 启用和配置健康监视
未完待续。。。