第十九章 排查和调试Web程序 之 防止和排查运行时问题

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 启用和配置健康监视

    未完待续。。。

时间: 2024-08-29 15:55:20

第十九章 排查和调试Web程序 之 防止和排查运行时问题的相关文章

第二十章 排查和调试Web程序 之 设计异常处理策略

1. 概述 本章内容包括: 多层架构中的异常处理.使用global.asax 或 自定义的HttpHandler 或 web.config中的属性来显示特定的错误页.处理 first chance 异常. 2. 主要内容: 2.1 多层架构中的异常处理 未完待续...

Gradle 1.12翻译——第十九章. Gradle 守护进程

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41343615 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

第十九章 文本处理流编辑器:awk编程

第十九章 文本处理流编辑器:awk编程 名词解释 awk 是一种编程语言,用于linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一个或多个文件.或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大个编程工具.它在命令行中使用,但更多是作为脚本来使用.awk有很多内建的功能,比如:数组.函数等,这是它和C语言的相同之处,灵活性是awk最大的优势. awk命令格式和选项 语法形式 awk [option] 'script'

【WPF学习】第二十九章 元素绑定——将元素绑定到一起

原文:[WPF学习]第二十九章 元素绑定--将元素绑定到一起 数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这正是我们所需要的行为--而且不必为此构建任何额外的基础结构. 为理解如何将一个元素绑定到另一个元素,下面创建一个简单的示例.该示例窗口包含了两个控件:一个Slider控件和一个具有单行文本的TextBlock控件.如果向右拖动滑动条上的滑

【WPF学习】第十九章 控件类

原文:[WPF学习]第十九章 控件类 WPF窗口充满了各种元素,但这些元素中只有一部分是控件.在WPF领域,控件通常被描述为与用户交互的元素--能接收焦点并接受键盘或鼠标输入的元素.明显的例子包括文本框和按钮.然而,这个区别有时有些模糊.将工具提示视为控件,因为它根据用户鼠标的移动显示或消失.将标签视为控件,因为它支持记忆码(mnemonics,将焦点转移到相关控件快捷键). 所有控件都继承自System.Windows.Control类,该类添加了一小部分基本的基础结构: 设置控件内容对齐方式

第十九章 APO连接与网络v节点

                  第十九章   APO连接与网络v节点       在编写网络底层实现前,需要做许多的准备工作:除了修改前面的章节外,可能还需写3章:本章.文件号管理类的实现.本地内存管理类的实现.我很希望最终的网络编程能给我惊喜:IP/TCP/UDP/ICMP的实现.包括所有的网络服务器的实现(HTTP.DNS.FTP等等),能到达300行的代码量:多于300行代码量那就更好了.我会很高兴.网络编程第一层简为socket层,第二层简称为TCP层,第三层简称为IP层:以后,不再

第十九章 面向对象的工具

学习要点:1.OOP 的魔术方法2.类函数和对象函数3.OOP 的反射API PHP通过类和方法等语言结构支持面向对象编程.同时也通过对象相关的函数和内置类为面向对象提供广泛支持. 一.OOP的魔术方法 PHP引入了__autoload()内置方法来自动包含类文件.__autoload()应该被写成单个参数的方法.当PHP引擎遇到试图实例化未知类的操作时,会调用__autoload()方法,并将类名当作字符串参数传递给它. function __autoload($_className) { r

189第一百八十九章 你的命是我的!

第一百八十九章 你的命是我的!   嗖! 露丝骤然弯腰,避开一名男子的腾空膝撞,未等男子落地,另一人已一脚踢中露丝腹. "唔--" 露丝被这股巨大的力量踹得迅速后退.若非她优秀的平衡能力与沉稳的下盘,怕是这一脚便能将她踢飞倒地. "呼--" 露丝手腕一翻,再次紧握***,抹掉嘴角血渍,那双明亮而有神的眸子死死盯着这对配合得天衣缝的男子. 他们很强. 比前面两个铁汉强大太多. 若是单打独斗,露丝有把握将手心的***刺入对方的心脏. 可他们不会给露丝这个机会,他们的配合

Gradle 1.12用户指南翻译——第二十九章. Checkstyle 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前