前言

作为一个.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跨平台或扫描二维码关注

.Net程序调试与追踪的一些方法相关推荐

  1. linux如何调试脚本程序,调试Linux shell脚本的方法

    在linux中调试shell脚本,常用的有三个方法.这里介绍下,希望对大家有所帮助. 方法一,使用echo命令. 在调试shell脚本时,可以用echo打印任何变量值,以判断错误原因. 方法二,she ...

  2. C#之程序调试方法总结

    C#之程序调试方法总结   在写程序过程中,调试程序是必不可少的步骤,现总结几种C#程序的调试方法:     (1)设置断点   所谓的断点,就是当程序运行到此处后会自动中断.设置断点的方法又两种: ...

  3. 7 php程序的调试方法_php程序调试方法总结

    相信很多朋友们都有调试程序的经历,然而很多时候调试程序是痛苦而又漫长的过程:它不仅需要细心,更需要耐心,切忌心浮气躁.但是当找出问题并顺利 解决它时,又会给人无比激动的喜悦.这里总结一下笔者在程序调试 ...

  4. 05 使用VS程序调试的方法和技巧1214

    05 使用VS程序调试的方法和技巧1214 01 02

  5. vs c语言程序调试方法,VS2015中的常用调试技巧分享

    原标题:VS2015中的常用调试技巧分享 为什么要学习调试? 调试(Debug)是作为一个程序员必须要学会的东西,学会调试可以极大的提高开发效率,排错时间,很多人不喜欢调试,但我认为这是一个很不可取的 ...

  6. 前端程序调试方法总结--高级版

    文章目录 前端程序调试方法总结--初级版 引言 一.先来认识一下这些按钮的功能 二.Sources资源页面的断点调试 三.Post man你值得拥有的网络请求神器 完结 前端程序调试方法总结–初级版 ...

  7. 作为SAP顾问都应该知道的ABAP程序调试方法

    摘要:虽然SAP系统的稳定性很不错,大部分问题不需要通过调试代码来解决.但是,别忘记我们还有很多自开发程序,或者某些配置不完整等,某些情况下通过调试ABAP程序是一个能快速找到问题根源的方法.本篇主要 ...

  8. Android程序调试方法介绍

    静态调试 适用于:通过打印变量的值来查看某一时刻值是否正确 Toast(Snackbar)打印法 一般的Android开发人员最爱的调试法,使用简便,仅需一行代码,轻松打印: Toast.makeTe ...

  9. c语言程序只能调试成功一半,c语言程序的调试方法所谓程序调试是指对程序的查错和排错。调试程序一般应经过以下几个步骤:一、先进行人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙...

    c语言程序的调试方法 所谓程序调试是指对程序的查错和排错. 调试程序一般应经过以下几个步骤: 一.先进行人工检查,即静态检查. 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查.这一步十分 ...

最新文章

  1. 软件设计开发笔记1:基于状态机的程序设计
  2. Github Actions
  3. 6. 成交量基础分析
  4. 面试题:判断字符串是否回文
  5. [AngularJS]--基本用法
  6. 如何从零构建你的自动化运维体系?——从制度到技术
  7. 我买了个阿里云服务器并在上面部署了一个项目
  8. 使用XShell连接Cygwin
  9. vscode 下载加速方法
  10. 【大话设计模式】模式二 :工厂模式
  11. JS实现数据库连接并查询
  12. 微信js-sdk+JAVA实现分享接口
  13. 决策树注意事项和参数调节
  14. C语言电码,翻译莫尔斯电码
  15. python 智能识别 商品_python人工智能-图像识别
  16. 程序员学c语言吗,为什么程序员要学C语言
  17. ios10使用 Clipboard点击无反应
  18. 淘宝开放平台应用申请?淘宝开放平台API申请?
  19. 爱一旦檫肩,咫尺即成天涯!
  20. SpringBoot----[9]---Spring Boot JdbcTemplate

热门文章

  1. Beyond Compare中插入表格数据的教程
  2. 电脑内部录音教程Virtual Audio Cable使用教程
  3. IIS服务器上增加mp4格式MIME 类型映射设置具体步骤
  4. url地址传参中文乱码处理
  5. 【转】测试人员的思想理念和工作方法
  6. 批处理解决局域网共享打印机问题
  7. LVS负载均衡-NET、DR模式配置
  8. 诺基亚首款Windows Phone智能手机将在年内推出
  9. Hibernate HQL 语法大全(上)
  10. 用啥Selenium?! .NET程序员就用自家的Playwright for .NET