作为一名程序员,解决bug是我们工作中常见的工作。甚至可以说,解决问题的能力是一个人工作能力的重要体现。因为这反映了一个程序员的技术水平、技术深度、经验等等。
所以在解决bug的过程中,定位问题是非常重要的。有句话说,‘发现问题是解决问题的一半。
本文描述了快速定位异常的方法(特别是。NET程序异常)。包括在本地定位异常。客户环境中的net程序异常和客户环境中的SilverLight异常。
1.本机位置异常
很容易找到我们机器中的异常。假设我们都在使用VisualStudio,我们只需要在调试-异常菜单中选中公共语言运行时异常。下图:
在上图中,我们可以找到五种类型的异常,比如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(帮助)或?姓名查看,还可以看到以下链接,
http://msdn . Microsoft.com/zh-cn/ms 229861(vs . 80)。aspx#
根据CLR的不同版本,Mdbg.exe有几个版本。
C: 程序文件(x86) Microsoft sdks windows v 7.0a bin mdbg.exe用于调试
CLR2.0(对应net2.0、3.0、3.5)程序。
C: 程序文件(x86) Microsoft sdks windows v 7.0a bin netf x 4.0 tools mdbg.exe用于调试CLR4.0程序(对于。net4.0)。
此外,Mdbg.exe还有一个名为MdbgCore.dll的依赖DLL。我们可以直接将Mdbg.exe和MdbgCore.dll的对应版本复制到客户端机器上使用。
没有安装VS的朋友可以复制一个安装包,是我自己打包的http://xiazai.jb51.net/201506/other/U8DebugSetup.rar,除了Mdbg.exe,我们还将在下面的文章中使用其他一些组件。
默认情况下,它将安装在C: 程序文件 u8调试中。
Mdbg.exe的用法很简单。双击打开它,然后输入(附加,显示附加的进程),按回车键,然后所有可以附加的进程将被列出。
PID代表过程标识,
输入控制台应用程序2.ex示例程序的11940附件。
这个时候程序会中断,所以我们可以在这个时候做一些设置。让程序在遇到异常时自动中断。
输入命令ca (catch)查看当前调试器遇到的哪些事件将被中断。
可以看到Exception对应的是Igonre all exception,也就是说所有的异常都被忽略,并且在异常发生时不会被中断。
输入命令ca ex,以便调试器在遇到异常时中断。
再次输入ca命令,您将看到对应于异常的值已更改为所有异常的停止。此时遇到的任何异常都将被中断。
输入命令g继续程序。
遇到异常时,会自动中断调试器,如下图所示:
输入命令w(其中,程序运行的位置)查看异常堆栈信息
三.在客户环境中定位SilverLight异常
如果客户端的silverlight应用服务器部署在外网上,我们可以直接用浏览器访问silverlight站点,然后用VS附着到浏览器进程进行调试。
调试方法和调试普通的一样。网络程序。
但是如果客户端的Silverlight服务器部署在内网上,那么只能在客户端上尝试。
而Mdbg.exe帮不了你,它调试不了Silverlight程序。
我们还有另一个著名的调试工具,Windbg。体积小于20M,很容易安装到客户端。您可以在线下载安装包。Windbg分为32位和64位版本。
请使用32位windbg调试32位程序,否则使用64位windbg。我们为什么不深入细节呢?只要记住。
风铃显然比Mdbg.exe强大得多,但使用起来也更复杂。
Windbg其实可以调试很多类型的程序,比如普通的。NET程序,c等等。然而,本文只解释了使用windbg定位异常的方法。
首先我们用IE浏览器打开silverlight应用,然后打开windbg附件对IE进程进行调试。附加进程的方法可以通过“文件”菜单下的“附加到进程”或使用F6快捷键来实现。
附加过程结束后,程序将被调试器中断。这时,我们需要做两个设置。
一种是设置程序在异常发生时中断调试器。设置方法是打开调试菜单下的事件过滤器,将CLR异常设置为启用。
此外,还需要加载调试器扩展。用过windbg的朋友都知道,调试。net程序需要加载调试器扩展sos.dll。这个sos.dll也有一个Silverlight版本。
位置是silverlight安装目录中的c: 程序文件(x86) Microsoft Silverlight 5 . 1 . 10411 . 0 sos.dll。
进入。在命令窗口中加载c: 程序文件(x86) Microsoft Silverlight 5 . 1 . 10411 . 0 sos.dll来加载它。
然后输入命令g继续执行程序。当异常发生时,它将在调试器中被中断。
如果出现异常,我们可以使用它!Pe(打印异常)查看异常信息。下图:
如果想查看堆栈信息,可以输入命令!clrstack
全部。NET异常基本上可以通过上述方法定位。至此,本文结束。