1 导言
在软件开发周期中,测试和修正缺陷(defect,defect与bug的区别:Bug是缺陷的一种表现形式,而一个缺陷是可以引起多种Bug的)的时间远多于写代码的时间。通常,debug是指发现缺陷并改正的过程。修正缺陷紧随debug之后,或者说二者是相关的。如果代码中存在缺陷,我们首先要识别造成缺陷的根本原因(root cause),这个过程就称作调试(debugging)。找到根本原因后,就可以修正缺陷。
那么如何调试代码呢?Visual Studio提供了很多用于调试的工具。有时调试需要花费大量时间去识别root cause。VS提供了许多辅助调试的便捷的工具。调试器(Debugger)包含错误列表、添加断点、可视化的程序流程、控制执行流程、Data Tips、监视窗口(watch windows)、多线程调试、线程窗口、并行调试概览以及IntelliTrace调试概览。我希望本文能够对调试功能的使用者有所裨益。请注意,本文使用VS2010。某些功能在旧版本中也是一致的,但是VS2010新增了许多features(Labeling breakpoint, Pinned DataTip, Multithreaded Debugging, Parallel debugging and IntelliTrace)。
2 如何启动调试?
图 启动调试(Start Debugging)
“附加到进程(Attach to Process)”是另一种启动调试的方法。Attach Process会为应用程序启动一个调试会话。可能我们更熟悉ASP.NET Web应用的Attach Process调试。我发了另外两篇相关的帖子。如下:
- Debug Your ASP.NET Application that Hosted on IIS
- Remote IIS Debugging: Debug your ASP.NET Application which is hosted on "Remote IIS Server"
通常我们通过在可能存在问题代码处加断点来启动调试。因此,我们从断点开始讲起。
3 断点(Breakpoints)
图 设置断点(Set Breakpoint)
3.1 使用断点进行调试
在中断模式下,你有多条可使用的命令,使用相应命令进行进一步的调试。
图 断点工具条(Breakpoint Toolbar)
3.1.1 逐过程(Step Over)
![debug51](https://i-blog.csdnimg.cn/blog_migrate/346da31257fd5ca82ac888a4a7e4e98e.png)
3.1.2 逐语句(Step Into)
![debug52](https://i-blog.csdnimg.cn/blog_migrate/ea2e54c60b3786727867a6f4f9842a9b.png)
3.1.3 跳出(Step Out)
3.1.4 继续(Continue)
3.1.5 设置下一语句(Set Next Statement)
![debug3_small](https://i-blog.csdnimg.cn/blog_migrate/a0273bd8c38730a0222a0c4a6b49f8d7.png)
3.1.6 显示下一语句(Show Next Statement [Ctrl+*])
3.2 断点标签(Labeling in Break Point)
class Program
{
static void Main(string[] args)
{
string[] strNames = { "Name1", "Name2", "Name3", "Name4", "Name5", "Name6" };
foreach (string name in strNames)
{
Console.WriteLine(name); // BreakPoint
}
int temp = 4;
for (int i = 1; i <= 10; i++)
{
if (i > 6)
temp = 5;
}
}
public static void Method1()
{
Console.WriteLine("Break Point in Method1"); // BreakPoint
}
public static void Method2()
{
Console.WriteLine("Break Point in Method2"); // BreakPoint
Console.WriteLine("Break Point in Method2"); // BreakPoint
}
public static void Method3()
{
Console.WriteLine("Break Point in Method3"); // Breakpoint
}
}
执行程序将停在第一个断点处。下图给出了断点列表。
![debug11_small.png](https://i-blog.csdnimg.cn/blog_migrate/aaa4fbf48a5889b42ebd830232a41e3a.png)