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或域名;

结束

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

时间: 2024-10-20 16:13:47

Net程序调试的相关文章

微信小程序调试之【不在以下合法域名列表中】

在微信小程序中进行网络通信,只能和指定的域名进行通信.目前,微信小程序提供如下四种类型的网络请求. 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 目前,无论上述哪一种请求方式,都有次数限制.本文记录的是,我在使用豆瓣论坛API请求时,遇到的错误截图及解决办法.简记如下: 一.问题截图 小程序调试中,遇到如下错误提示: "xxx不在以下合法域名列表中 ,请参

.NET应用程序调试—原理、工具、方法

阅读目录: 1.背景介绍 2.基本原理(Windows调试工具箱..NET调试扩展SOS.DLL.SOSEX.DLL) 2.1.Windows调试工具箱 2.2..NET调试扩展包,SOS.DLL.SOSEX.DLL 2.3.调试系统的基本流程及架构(.NETDAC概念.mscordacwks.dll) 2.4.VisualStudio中集成扩展调试(更加细粒度的调试程序) 3.调试程序类型(客户端程序.服务端程序) 4.调试方式及场景 4.1.本机调试(Attach Process,调试器启动

Chisel辅助iOS 应用程序调试,MusicApp模仿酷狗4.0 UI框架

本文转载至 http://www.cocoachina.com/ios/20140825/9446.html Chisel Chisel集合了大量的LLDB 命令来辅助iOS 应用程序调试,并支持添加本地和自定义的命令.以下是其中所包含的一些命令,并对其适用于iOS还是OS X进行了区分: M13ProgressSuite 该项目包含了多种不同的风格的进程指示图,比如普通圆环形.分段圆形加载.圆形饼图加载以及条形加载等等,比如其中UINavigationBar的进程动画非常像苹果的Messag

Linux下C/C++程序调试基础(GCC,G++,GDB,CGDB,DDD)

在写程序的时候,经常会遇到一些问题,比如某些变量计算结果不是我们预期的那样,这时我们需要对程序进行调试.本文主要介绍调试C/C++在Linux操作系统下主要的调试工具. 在Linux下写程序,C/C++主要的编译器有GCC/G++,ICC等,像我等穷码农,最喜欢GCC了,很大原因是他免费!所以,我们以GCC/G++为例介绍主要的调试工具. 分以下几个内容介绍: 1.调试之前的工作 2.选择调试工具 3.调试步骤 点我,请帮我投一票! 调试之前的工作 编译器在编译阶段需要产生可供调试的代码,才能被

程序员突围-程序调试分析(序)

-从实践到思考,痛苦的煎熬 其实算算,工作一年了,从大学毕业至今,接触编程已经五年了,但是真正的编程感觉还没有开始,从大一开始接触C语言,陆续接触c++,java,C#等等,现在感悟到了一点,编程语言学那么多有什么用呢?其实把一门编程语言学精了,学透了,其他的是触类旁通的(底层的C语言和C++可能有点例外),下面我会说一下我的经历,我感觉可能是大多数学习编程人的必经的阶段,让大家对编程的抵触少一些,然后想想一个我这样的白痴都能慢慢的开始程序调试,程序分析,你们绝对比我强的,下篇文章才会进入我的程

程序员突围-程序调试分析(一) 我从菜鸟进化的感悟

程序员突围-程序调试分析(一) 我从菜鸟进化的感悟 在说程序调试分析之前,我们还是了解一些基本的概念性的东西(在下现在从事java,因而都已java为例) 1. bug的分类 根据程序的阶段和MSDN和看过的一些书籍的分析,bug分为编译错误,运行时错误和逻辑的错误 (1)  编译错误 一般初学者犯错比较多的地方,编译错误,说白了就是程序在从java编译成.class文件时出现了问题,这个问题的现象比较明显,比如说语句写的有问题,那么对于这类问题的解决方法是什么呢,翻翻书,翻翻API(翻阅API

php程序调试: xdebug的配置

如何在phpeclipse中像调试Java程序一样调试php呢? XDebug的版本很多,打开http://xdebug.org/index.php,把网站仔细看一下,你会发现有句"If you don't know which one you need, please refer to the custom installation instructions.",非常好,打开这个页面,按照要求将phpinfo()的内容copy & paste到form里面,然后按一下&quo

杂【第一天】包括eclipse常见操作,程序调试模式

观看传智播客视频笔记,感谢 eclipse的常见操作: 1.当即热版本低于编译器版本是,会出现bad Vresion number in class file的错误: 2.快捷键: alt+/:模板键 ctrl+1:快速修复 ctrl+shift+o:导包 设置代码阿保存的时候自动格式化:windows->首选项->Java->Editor->save Actions 代码移动:alt+上下键 重置视图:window->reset perspective... 3.典型的字节

No.14 程序调试

程序排错与程序开发是一个不可分割的整体,广义的程序开发包括程序调试,要正视程序排错 1. 程序的可调试性 添加注释 使用log log4j:辅助程序调试:记录程序的运行日志 logger及其继承关系 只有当方法的优先级高于/等于logger的优先级时才会输出 如果程序没有显示地指定某个logger的level,将继承离他最近的祖先的level 将logger的名字与它所在的类的全类名相同 logger继承体系与类的继承体系相同 当控制某个包内的调试信息时,设置该变  以该 包名 为 名字的 lo

程序调试时出现的错误

1.         程序调试时出现的错误: a)         逻辑错误:服务器端的代码. i.              因为服务器端的代码一般是静态的强类型语言,编译器会矫正一些拼写错误. ii.              服务器端的代码出现错误之后,一般可以通过编译器调试代码解决. iii.              服务器端编程要学会使用快捷键,增加编程效率,减少出错概率. b)         拼写细节错误:xml配置文件,html文档流,CSS渲染文件,sql脚本,代码中的字符串