.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(, null, message);
}
}
DebugOut
使用这个办法,我可以做到一个程序,当以控制台服务时,就输出到控制到,当以服务进程运行之后,调试信息可以被收集工具收到到,而我们的代码还是调用Console.WriteXXX。
远程动态调试
希望没走到这步就可以解决问题,远程调试的要求还是比较高的:
1、远程的程序必须带pdb文件,最好与本机的代码是完全一样的;
2、vs附带的“远程调试工具”复制到远程机器上,根据x86或x64系统运行对应的调试服务端;
3、vs->调试->附加到进程,传输为“远程(远程无身份验证)”,“限定符”为远程机器的ip或域名;
结束
以上是个人现在常用的调试与追踪方法,你也可以把你的其它好点子分享分享。
.Net程序调试与追踪的一些方法的更多相关文章
- .NET应用程序调试—原理、工具、方法
阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...
- 嵌入式linux应用程序调试方法
嵌入式linux应用程序调试方法 四 内存工具 五 C/C++代码覆盖.性能profiling工具 四 内存工具 您肯定不想陷入类似在几千次调用之后发生分配溢出这样的情形. 许多小组花了许许多多时间来 ...
- 【matlab】MATLAB程序调试方法和过程
3.8 MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...
- VUE程序调试的方法
目录 VUE程序调试的方法 1.写本文的背景 2.调试与测试 3.Console调试法 3.1 添加console.log指令 3.2 调出温度界面如下 3.3 Google浏览器的Console窗口 ...
- Net程序调试
Net程序调试 前言 作为一个.net开发工程师,不管是在写桌面程序.服务程序或web程序,在开发阶段,我们必须非常熟悉vs的动态调试技能,当然web程序可能还需要调试前端的脚本或样式,这不在本文的讨 ...
- 57. Android之程序调试LogCat (转)
无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一 ...
- MapReducer程序调试技巧
写过程序分布式代码的人都知道,分布式的程序是比较难以调试的,但是也不是不可以调试,对于Hadoop分布式集群来说,在其上面运行的是mapreduce程序,因此,有时候写好了mapreduce程序之后, ...
- Xdebug开源PHP程序调试器
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. 本文为大家讲解的是在linux下xdebug的安装和配置方法,感兴趣的同学参考下 ...
- [安卓][转]Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
随机推荐
- 瀑布流原生ajax,demo
最近听朋友们说起瀑布流挺多的,自己就去研究下了,一个简单的原生demo,分享给大家... 简单分为三个文档,有详细的注释 img:ajax.php:demo.php 其中img中放入图片 1.jpg: ...
- .Net Core中使用ref和Span<T>提高程序性能
一.前言 其实说到ref,很多同学对它已经有所了解,ref是C# 7.0的一个语言特性,它为开发人员提供了返回本地变量引用和值引用的机制. Span也是建立在ref语法基础上的一个复杂的数据类型,在文 ...
- MySQL高可用方案MHA自动Failover与手动Failover的实践及原理
集群信息 角色 IP地址 ServerID 类型 Master ...
- sh脚本异常,binsh^M bad interpreter No such file or directory
错误 在Linux中执行.sh脚本,出现如下异常 /bin/sh^M: bad interpreter: No such file or directory 原因 在windows系统中编辑的.sh文 ...
- SQL Server 中函数的理解总结
T-SQL语言为我们提供了更加灵活的方式操作数据,那就是函数,函数总的分为三大类:标量函数:(传入一个参数,再传出一个参数)聚合函数(传入多个参数,传出一个参数),表值函数(传入一个结果集对象,让我们 ...
- python爬虫从入门到放弃(七)之 PyQuery库的使用
PyQuery库也是一个非常强大又灵活的网页解析库,如果你有前端开发经验的,都应该接触过jQuery,那么PyQuery就是你非常绝佳的选择,PyQuery 是 Python 仿照 jQuery 的严 ...
- js实现防盗图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- shared_ptr注意点
1.原始指针不能直接使用赋值运算符对shared_ptr进行赋值运算 std::shared_ptr<int> p; p= ); //error p.reset(); //success ...
- 深入探索C++对象模型(六)
执行期语意学(Runtime Semantics) 对象的构造和析构(Object Constructor and Destructor) 一般而言,constructor和destructor的安插 ...
- (转)关于 Java 对象序列化您不知道的 5 件事
关于 Java 对象序列化您不知道的 5 件事 转自:http://developer.51cto.com/art/201506/479979.htm 数年前,当和一个软件团队一起用 Java 语言编 ...