.net程序调试一:快速定位异常
作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现。因为这体现了一个程序员的技术水平、技术深度、经验等等。
那么在我们解决BUG的过程中,定位问题是非常重要的。有句话叫"发现问题是解决问题的一半。
本文讲述就快速定位异常(专指.NET程序异常)的方法。包括在本机定位异常,在客户环境定位.net程序异常,在客户环境定位SilverLight异常。
一:定位本机异常
在我们本机定位异常很容易。假设我们都是使用的的VisualStudio,那么只需要在调试->异常菜单中将Common Langeuage Runtime Exception(CLR异常)勾选。如下图:

在上面的图片中可以发现有5种类型的异常,例如c++异常、win32异常等等。对于.NET程序来说我们只关注CLR异常。
接下来进行调试,当自己的程序代码中有异常的时候,VS就会自动定位到异常的位置。
我们可以看到异常的详细信息,并且可在调用堆栈窗口中看到 程序的堆栈信息。在堆栈信息中我们可以看到在哪个类、哪个函数中出的错,如下图:

调试程序有两种方式,一种是用VS直接启动程序,另一种是附加到进程。

附加到进程的时候,程序类型不要选错了,我使用的是.net4.0 所以程序类型选择的是 托管(4.0版)代码。
另外附加到进程有个快捷键是 Ctrl+Alt+P。
但是如果异常不是你的代码中抛出的,那么如何定位呢?
可以打开 调试 菜单下面的 选项和设置,将 启用"仅我的代码" 这一项取消勾选。那么别人代码中的异常就可以抛出了。

二:在客户环境定位.net程序异常:
我们的程序最后都会运行在客户的环境中,客户环境上不会有VS这样的开发工具,那么怎么办呢?
我们可以使用一个很小巧的命令行调试工具Mdbg.exe,这个工具是安装VS的时候附带安装的,仅能调试.net托管代码。
Mdbg.exe其实有很多功能,不过本文只讲它定位异常的功能,后续文章会讲使用Mdbg.exe单步调试的方法。
Mdbg.exe命令详细介绍可以 输入 h(help) 或者? 名来查看,也可以看下面的链接,
http://msdn.microsoft.com/zh-cn/ms229861(vs.80).aspx#
根据CLR版本的不用,Mdbg.exe也是有多个版本的。
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\Mdbg.exe用于调试
CLR2.0(对应net2.0,3.0,3.5)程序。
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\Mdbg.exe用于调试CLR4.0程序(对用.net4.0)。
另外Mdbg.exe有一个依赖DLL 叫做MdbgCore.dll。我们可以直接将相应版本的Mdbg.exe和MdbgCore.dll拷贝到客户机器上使用。
没有安装VS的朋友可以拷贝我自己封装的一个安装包 http://files.cnblogs.com/yuilin/U8DebugSetup.rar,这里面除了Mdbg.exe还有一些其他组件我们后面的文章会用到。
默认会安装在 C:\Program Files\U8Debug。
Mdbg.exe的使用方法很加简,双击打开它,然后输入 a(attach,显示附加的进程),回车,这时会列表所有可以附加的进程。

PID 表示进程标识,
输入a 11940 附件到 ConsoleApplication2.ex示例程序。
这时程序会中断执行,我们在这个时机可以做一些设置。让程序在遇到异常时自动中断。
输入命令 ca (catch)查看当前调试器遇到哪些事件会中断。

可以看到 Exception对应的是Igonre all exception ,也就是忽略所有异常,发生异常时不会中断。
输入命令 ca ex 这样调试器遇到异常时就会中断了。
再次输入ca 命令会看到 Exception对应的值已经变为Stop on all exception了。这时遇到任何异常都会中断了。

输入命令 g 让程序继续执行。
当遇到异常时会自动中断到调试器,如下图:

入命令 w(where,程序运行到哪里了) 可以查看异常堆栈信息

三:在客户环境定位SilverLight异常
如果客户的silverlight应用服务器部署在外网,那么我们可以直接用浏览器访问该silverlight站点,然后用VS附加到浏览器进程来调试。

调试方法比调试普通.net程序一样。
但是如果,客户的Silverlight服务器是部署在内网,那么你只能在客户机器上调试了。
并且Mdbg.exe也帮不了你了,它不能调试Silverlight程序。
我们还有另一个著名的调试工具Windbg。体积大概有不到20M,很容易安装到客户机,安装包大家可以到网上自己下载。windbg分为32位和64位两个版本,
调试32位的程序请使用32位windbg,反之则要使用64位的windbg,具体为什么我们不用深究,记住了就可以了。
相比Mdbg.exe的小巧实用,Windbg显然强大的多,但是使用起来也复杂一些。
Windbg其实可以调试很多种类型的程序,例如普通.NET程序,c++等。但是本文只讲解使用windbg定位异常的方法。
首先我们使用IE浏览器打开silverlight应用程序,然后打开windbg附件到IE进程来调试。附加进程的方式可以通过File菜单下的Attach to a process或者使用F6快捷键。

附件进程后 程序会中断到调试器,这个时候我们需要做两个设置。
一个是 设置程序发生异常时让其中断到调试器,设置方法是打开debug菜单下的Event Filter,将CLR异常设置其为enable。

另外需要加载调试器扩展,使用过windbg的朋友都知道调试.net程序需要加载一个调试器扩展sos.dll。这个sos.dll也有一个Silverlight版本的。
位置在silverlight的安装目录 C:\Program Files (x86)\Microsoft Silverlight\5.1.10411.0\sos.dll。
我们再command窗口中输入 .load C:\Program Files (x86)\Microsoft Silverlight\5.1.10411.0\sos.dll 来加载它。
之后输入命令 g 来回复程序的执行。当发生异常时就会中断到调试器中。
发生异常是我们可以使用!pe(print exception) 来查看异常信息。如下图:

如果想查看堆栈信息的话可以输入命令 !clrstack

通过上述方法基本可以定位所有的.NET异常。至此,本文结束。
.net程序调试一:快速定位异常的更多相关文章
- .NET程序调试技巧(一):快速定位异常的一些方法
作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...
- WinDBG快速定位异常位置
在WinDBG中通过搜索内存中保存的CONTEXT结构来定位发生的异常信息,再通过WinDBG命令.cxr显示对应的调用堆栈信息. .foreach ( place { s-[1]d 0 L?FF ...
- 【iOS】iOS 调试快速定位程序在哪崩溃
iOS 开发过程中经常遇到程序崩溃.快速定位程序在哪崩溃的步骤如下: 1. 2. 3. 这样设置后,程序崩溃时会定位到崩溃的语句,如下: 原文链接:iOS开发何如在调试的时候轻松找到程序在哪里崩溃
- 经验分享:程序员如何快速定位问题(BUG)
让我掉下眼泪的 不止内存泄漏 让我夜夜不眠的 不止你的需求 明天还要改多久 你攥着我的手 让我感到为难的 是善变的需求 发布总是在半夜 回滚是永远的愁 错误(Bug)随时的暴漏 困扰着我心头 作为程序 ...
- [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
原调试debugwindbghangprocess explorer 前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗? ...
- IntelliTrace 调试、定位异常
最近看了一个开源数据库管理,然后没有认真看它的配置环境,想看看是什么东西, 然后发现有类型转换的错误,但是一下子也定位不到哪里出错? 所以对于这种一下子找不到异常在哪里的,可以使用intellitra ...
- 使用MAP文件快速定位程序崩溃代码行 (转)
使用MAP文件快速定位程序崩溃代码行 =========================================================== 作者: lzmfeng(http://lz ...
- 「Python调试器」,快速定位各种疑难杂症!!
现在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要 ...
- MDK快速定位硬件异常位置方法(移植SEGGER_HardFaultHandler库),调用show caller code即可快速锁定(参考硬汉哥)
今天网上看到keil中如果快速定位hardfault的方法参考如下说明:1. MDK的硬件异常分析主要是通过MDK调试状态进行分析的. 文档下载 apnt209.pdf (651 KB, 下载次数: ...
随机推荐
- 重命名IDEA14项目名
Project Settings / Project ->">工程结构(ctrl-alt-shift-s)->设置->项目/项目Project name: 请注意,这 ...
- Bootstrap3实现的响应式幻灯滑动效果个人作品集/博客网站模板
在线演示 本地下载 如果你想学习如何开发和使用的话,请参考我们免费的课程: Bootstrap3开发滑动风格的博客网站模板
- leetcode笔记:Sqrt(x)
一. 题目描写叙述 Implement int sqrt(int x). Compute and return the square root of x. 二. 题目分析 该题要求实现求根公式,该题还 ...
- linux pdb调试总结
1.首先gdb编译: gcc -g xxx.c -o xxx 2.然后 gdb xxx进入调试 break 行号 加入断点 (1)然后run就能够跑到下一个断点 (2)step(或s)单步跟踪 (3) ...
- Missing styles. Is the correct theme chosen for this layout? Use the Theme combo box above the layou
android无法静态显示ui效果. Missing styles. Is the correct theme chosen for this layout? Use the Theme combo ...
- more命令(转)
原文:http://www.cnblogs.com/peida/archive/2012/11/02/2750588.html more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示 ...
- Linux对文件归档和压缩(学习笔记八)
一.归档和压缩 压缩命令工具:gzip,bzip2 归档命令工具:tar 二.压缩 2.1.gzip gzip是一种标准的.广泛应用的文件压缩和解压缩实用工具.gzip允许文件并置.用gzip压缩文件 ...
- [C++设计模式]template 模板方法模式
模板法模式:定义一个操作中的算法骨架.而将一些步骤延迟到子类中. 依照<headfirst 设计模式>的样例.煮茶和煮咖啡的算法框架(流程)是一样的.仅仅是有些算法的实现是不一样的,有些是 ...
- javascript---对象和函数的引用、浅拷贝、深拷贝、递归
1.javascript 对象和函数的引用 <!doctype html> <html lang="en"> <head> <meta c ...
- js es6 map 与 原生对象区别
区别 object和Map存储的都是键值对组合.但是: object的键的类型是 字符串: map的键的类型是 可以是任意类型: 另外注意,object获取键值使用Object.keys(返回数组): ...