zoukankan      html  css  js  c++  java
  • .Net程序调试与追踪的一些方法

    前言

    作为一个.net开发工程师,不管是在写桌面程序、服务程序或web程序,在开发阶段,我们必须非常熟悉vs的动态调试技能,当然web程序可能还需要调试前端的脚本或样式,这不在本文的讨论范围。本文主要介绍vs的动态调试基本知识,以及介绍如何追踪已发布的程序的调试日志或技能。

    开发阶段

    本阶段主要以动态调试为主,调试的利器当然是vs。

    动态调试步骤:

    1、拥有程序的代码和pdb文件;

    2、在你要观察逻辑代码行号下断点;

    3、vs->调试->开始调试(你可能需要条件来触发让程序执行到你要的逻辑代码行号);

    4、对于已运行的程序,你也可以vs->调试->附加到进程 来完成启动调试,如果已运行的程序是服务进程(非桌面进程),在附加到进程对话框要勾选上“显示所有用户的进程”;

    断点的条件过滤

    在动态调试中,如果在多线程环境,一个断点断到之后,如果使用“逐语句”到下语句的话,断点又会马上被断到,造成跟踪上下文很不方便;还一种情况,在循环体里下断,但是只想跟踪符合一定条件的点。这些时候,应使用条件断点,在某代码行号下断,然后右键左边红色断点实圈,弹出的菜单里可以给断点设置条件,设置条件之后的断点,叫条件断点,vs显示为红色的虚圈。

    生产阶段

    本阶段以追踪为主,追踪应用程序的日志文件、调试信息输出和异常等,不得以的情况下,可以使用远程动态调试来调试。

    日志文件

    可能你第一时间就想到log4net,没错,它可以将一些调试信息和异常信息写入文件或db,很方便查询。除此之外,我们应该还要了解 Exceptionless ,它的强大之处在于更完善的异常上下文内容收集、异常分类显示与汇总,在Exceptionless 查看异常信息,几乎就可以静态分析出异常的原因从而直接修改代码。

     

     

    收集调试信息

    由于性能的原因,日志文件里,我们一般只记录重要的和异常的内容,不太重要的产生又频繁的内容,在控制台的时候,我们可以使用Console.WriteXXX将这些内容实时显示。实际上,只要调用 System.Diagnostics.Debugger的Log方法,这个方法输出的内容,在不调试的情况下,也可以使用一些工具进行捕获这些输出内容,以下为提供的两个收集工具。

    1、使用DebugViewer工具进行收集

    这个工具是我使用.net来编写的收集程序,UI很好友,已开源托管在github上面了。

    2、使用debugview工具进行收集

    收集Console.WriteXXX的内容

    在写控制台程序的时候,Console.WriteXXX能方便我们追踪,但在非控制台程序(比如服务进程、windows桌面应用和web应用),这些Console.WriteXXX实际上是不产生任何输出的。现在我们的目标是,在非控制台类型的应用,只要调用了Console.WriteXXX,也能让收集工具能收集到这些输出信息。

    1、在程序初始化的时候,替换Console静态类的Out属性,Console.SetOut( debugOut )

    2、实现自己的DebugOut,将Write的内容输出到Debugger.Log方法

        public class DebugOut : System.IO.TextWriter
        {
            public override void Write(char[] buffer, int index, int count)
            {
                var message = new string(buffer, index, count);
                System.Diagnostics.Debugger.Log(0, null, message);
            }
        }
    DebugOut

    使用这个办法,我可以做到一个程序,当以控制台服务时,就输出到控制到,当以服务进程运行之后,调试信息可以被收集工具收到到,而我们的代码还是调用Console.WriteXXX。

    远程动态调试

    希望没走到这步就可以解决问题,远程调试的要求还是比较高的:

    1、远程的程序必须带pdb文件,最好与本机的代码是完全一样的;

    2、vs附带的“远程调试工具”复制到远程机器上,根据x86或x64系统运行对应的调试服务端;

    3、vs->调试->附加到进程,传输为“远程(远程无身份验证)”,“限定符”为远程机器的ip或域名;

     

    结束

    以上是个人现在常用的调试与追踪方法,你也可以把你的其它好点子分享分享。

  • 相关阅读:
    Delux DLVB13摄像头在Windows Vista下的使用
    Windows在删除文件时怎么不确认了?
    Tornado启动仿真器时出现错误:error : simulator failed to initialize before timeout.
    VxWorks下使用双向链表的小例子
    MPI错误:提示XXX Credentials for yyy rejected connecting to XXX
    运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常
    拖延不是毛病,是你不够强大
    BNF范式含义和基本用法
    堆栈的区别
    永不抱怨
  • 原文地址:https://www.cnblogs.com/kewei/p/7096905.html
Copyright © 2011-2022 走看看