.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);}}

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

 

远程动态调试

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

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

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

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

 

结束

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

原文地址:http://www.cnblogs.com/kewei/p/7096905.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

toString()

Object类中toString()的使用: 1. 当我们输出一个对象的引用时,实际上就是调用当前对象的toString() 2. Object类中toString()的定义:public String toString() {return getClass().getName() "" Integer.toHexString(hashCode())…

线上服务器内存分析及问题排查

转载自 线上服务器内存分析及问题排查 平常的工作中,在衡量服务器的性能时,经常会涉及到几个指标,load、cpu、mem、qps、rt等。每个指标都有其独特的意义,很多时候在线上出现问题时,往往会伴随着某些指标的异常。大部…

ssl1762-工厂的烦恼【图论,最短路变形(最长路)】

题目 一个有向图,求它的最长路。 输入 5 5 1 2 2 2 4 9 1 3 7 3 4 1 4 5 6 输出 17 解题思路 就是最短路的算法进行一些更改。不过注意加判断 if (a[i][k] && a[k][j]) 因为最短路如果有一个不能连不会对结果照成影响,可最长路就不…

RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World

一、简介 RabbitMQ是一个消息的代理器,用于接收和发送消息,你可以这样想,他就是一个邮局,当您把需要寄送的邮件投递到邮筒之时,你可以确定的是邮递员先生肯定会把邮件发送到需要接收邮件的人的手里,不…

红歌合唱之团结就是力量

今天,由王老师组织的班级红歌大合唱之“团结就是力量”圆满落幕!下面是整个合唱的视频,同学们个个都朝气蓬勃:以下是《团结就是力量》的全部歌词团结就是力量团结就是力量这力量是铁这力量是钢比铁还硬比钢还强向着法西斯蒂开火让…

ssl1615-Frogger【图论,最小生成树,并查集】

题目 给一个无向图,要求从点1到点2的一条路,要求这条路上的边的最大值尽量小。 输入输入 多组数据,每个数据n1行,分别是n和点的坐标 2 0 0 3 4 3 17 4 19 4 18 5 0 输出 这条路上的边的最大值 Scenario #1 Frog Di…

Servlet API

1、书写一个servlet的方式 Servlet必须直接或间接实现 javax.servlet.Servlet 接口 通过继承javax.servlet.GenericServlet 类实现跨协议的 Servlet 通过继承javax.servlet.HttpServlet实现HTTP Servlet 自己定义个servlet,然后其他的java类都继承自己写好的servlet…

EventBus In eShop -- 解析微软微服务架构eShopOnContainers(四)

引言 大家好像对分析源码厌倦了,说实在我也会厌倦,不过不看是无法分析其后面的东西,从易到难是一个必要的过程。 今天说下EventBus,前几天园里的大神已经把其解刨事件总线(Event Bus)知多少,我…

再有人问你synchronized是什么,就把这篇文章发给他。

转载自 再有人问你synchronized是什么,就把这篇文章发给他。 在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,提供了一系列和并发处理相关的…

基本数据类型、包装类、String三者之间的相互转换

package com.wdl.day13;import org.junit.Test;/** 包装类的使用:* 1.java提供了8种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征** 2.掌握的:基本数据类型、包装类、String三者之间的相互转换****/ public class WrapperTest {//Strin…

很简单很简单的DBHelper类

记录一个简单的DBHelper类吧&#xff0c;用的时候在上来拿&#xff01; /// <summary>/// 数据库连接工具类/// </summary>public class DBHelper{string constr "Data Source.;Initial CatalogschoolDB;Integrated SecurityTrue";private SqlConnecti…

洛谷P3371-【模板】单源最短路【SPFA】

题目 一个有向图&#xff0c;求一点到所有点的最短距离 输入 4 6 1(4个点&#xff0c;6条边&#xff0c;从1出发) 1 2 2(1点到2点有一条权值2的线) 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 输出 0 2 4 3 解题思路 这题数据非常的大 说明 时空限制&#xff1a;1000ms,128M …

DDD理论学习系列(1)-- 通用语言

1.引言 在开始之前&#xff0c;我想我们有必要先了解以下DDD的主要参与者。因为毕竟语言是人说的吗&#xff0c;就像我们面向对象编程一样&#xff0c;那通用语言面向的是&#xff1f;DDD的主要参与者&#xff1a;领域专家开发人员领域专家&#xff1a;精通业务的任何人。开发…

Java中枚举的线程安全性及序列化问题

转载自 Java中枚举的线程安全性及序列化问题 Java SE5提供了一种新的类型-Java的枚举类型&#xff0c;关键字enum可以将一组具名的值的有限集合创建为一种新的类型&#xff0c;而这些具名的值可以作为常规的程序组件使用&#xff0c;这是一种非常有用的功能。本文将深入分析枚…

Servlet 参数读取

1、配置参数读取的意义&#xff1a; 把参数提取到配置的信息中这样就大大的增加了整个代码的使用性方面后期的代码维护 需要知道&#xff0c; 在这里的参数读取仅仅是读到程序里面。 2、实现代码 package com.bjsxt.servlet;import javax.servlet.ServletException; import j…

定了!对于本周四(7.16日)抽奖活动取消简要说明,新抽奖活动暂定下周三(7.22日)...

大家好&#xff0c;我是雄雄&#xff0c;对于本周四&#xff08;7.16日&#xff09;抽奖活动取消简要说明&#xff0c;新抽奖活动暂定下周三&#xff08;7.22日&#xff09;&#xff0c;欢迎各位粉丝积极参与&#xff0c;奖品已经准备好了&#xff0c;你&#xff01;准备好了吗…

洛谷P1144-最短路计算【日常最短路,日常图论,SPFA】

题目 一个无向图&#xff0c;求点1到每个点的最短路的路径数量 输入 5 7(5个点,7条边) 1 2(表示1到2有边) 1 3 2 4 3 4 2 3 4 5 4 5 输出 &#xff08;答案mod100003&#xff09; 1 1 1 2 4 解题思路 注意这是无向图&#xff0c;然后请看数据范围 对于20%的数…

RabbitMQ系列教程之二:工作队列(Work Queues)

今天开始RabbitMQ教程的第二讲&#xff0c;废话不多说&#xff0c;直接进入话题。 (使用.NET 客户端 进行事例演示) 在第一个教程中&#xff0c;我们编写了一个从命名队列中发送和接收消息的程序。在本教程中&#xff0c;我们将创建一个工作队列&#xff0c;这个队列将用于在…

单例 (Singleton)设计模式

所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。如果我们要让类在一个虚拟机中只能产生一个对象&#xff0c;我们首先必须将类的构造器的访问权限设…

面试中经常会问的智力题,来看看你会做几道

转载自 面试中经常会问的智力题&#xff0c;来看看你会做几道 下面是大部分题目来自滴滴出行2017秋招题。开始头脑风暴吧~~~ 问题 question one 有50家人家&#xff0c;每家一条狗。有一天警察通知&#xff0c;50条狗当中有病狗&#xff0c;行为和正常狗不一样。每人只能通…