Net程序调试
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方法
DebugOut
使用这个办法,我可以做到一个程序,当以控制台服务时,就输出到控制到,当以服务进程运行之后,调试信息可以被收集工具收到到,而我们的代码还是调用Console.WriteXXX。
远程动态调试
希望没走到这步就可以解决问题,远程调试的要求还是比较高的:
1、远程的程序必须带pdb文件,最好与本机的代码是完全一样的;
2、vs附带的“远程调试工具”复制到远程机器上,根据x86或x64系统运行对应的调试服务端;
3、vs->调试->附加到进程,传输为“远程(远程无身份验证)”,“限定符”为远程机器的ip或域名;

结束
以上是个人现在常用的调试与追踪方法,你也可以把你的其它好点子分享分享。
Net程序调试的更多相关文章
- 【系统篇】从int 3探索Windows应用程序调试原理
探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...
- .NET应用程序调试—原理、工具、方法
阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.S ...
- spread 程序调试时,未激活的提示解决
场景:程序调试运行,打开含spread组件的窗体时如下: 解决: 将spread组件拖到某一个窗体后,会在properties中出现license文件.再运行,OK! 注意: license文件一定是 ...
- 57. Android之程序调试LogCat (转)
无论什么样的程序开发过程中,出现错误都是不可避免的,一般情况下,语法错误会被开发环境检测到,并能及时的提示我们错误的位置以及修改的方法,但是逻辑错误就不是那么容易被发现了,通常逻辑错误的定位和分析是一 ...
- 【matlab】MATLAB程序调试方法和过程
3.8 MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...
- MapReducer程序调试技巧
写过程序分布式代码的人都知道,分布式的程序是比较难以调试的,但是也不是不可以调试,对于Hadoop分布式集群来说,在其上面运行的是mapreduce程序,因此,有时候写好了mapreduce程序之后, ...
- Xdebug开源PHP程序调试器
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况. 本文为大家讲解的是在linux下xdebug的安装和配置方法,感兴趣的同学参考下 ...
- [安卓][转]Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
- 程序调试手段之gdb, vxworks shell
调试一个程序主要用到的功能: 启动程序 设置函数断点 设置数据断点 单步执行 查看内存值 修改内存值 linux下的gdb,和vxworks下的shell 虽然使用方式和调试命令略有不同,但是都能满足 ...
- Android eclipse中程序调试
一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的.步骤如下.1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键点击菜单,选择 Toggle Breakpoi ...
随机推荐
- 支持10W高并发请求的IIS Web服务器常用设置
支持高并发的IIS Web服务器常用设置 适用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 适用的Windows版本:Windows Server 2008, Windows ...
- 1.namesapce用法
namespace用法示例 #include <iostream> using namespace std; //定义域名空间 namespace myspace { ; void sho ...
- 网络IO
1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...
- LeetCode Algorithm 133_Clone Graph
Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...
- HDU 2063 过山车 第一道最大二分匹配
http://acm.hdu.edu.cn/showproblem.php?pid=2063 题目大意: m个女生和n个男生一起做过山车,每一排必须一男一女,而每个女孩愿意和一些男生坐一起,, 你要找 ...
- VMware Ubuntu安装具体过程
不是每个程序猿都必须玩过linux,仅仅是博主认为如今的非常多server都是linux系统的,而自己属于那种前端也搞.后台也搞,对框架搭建也感兴趣,可是非常多生产上的框架和工具都是安装在server ...
- C#添加水印
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- 【z04】计算系数
[题目链接]:http://noi.qz5z.com/viewtask.asp?id=z04 [题解] 用二项式定理可以写出下列通式 组合数可以用杨辉三角搞出来; a的x次方直接乘就好了;指数也不大. ...
- 【转载】C# winform操作excel(打开、内嵌)
本文转载自静待"花落<C# winform操作excel(打开.内嵌)> 说明:显示的excel是利用模板创建的 using System;using System.Coll ...
- Windows跨进程设置文本和发送消息
进程内设置文本,可以调用SetWindowText,跨进程这个会无效,应当如下:::SendMessage(hWnd, WM_SETTEXT, NULL, (LPARAM)文本内容); 注意这里不能使 ...