VS2010调试 --指南 Reference from : http://blog.csdn.net/kingzone_2008/article/details/8133048

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 如何启动调试?

可以通过VS的调试(Debug)菜单启动调试。点击调试菜单下的“启动调试”或者按F5键启动。如果你已经在代码中加入了断点,那么执行会自动开始。


图 启动调试(Start Debugging)

“附加到进程(Attach to Process)”是另一种启动调试的方法。Attach Process会为应用程序启动一个调试会话。可能我们更熟悉ASP.NET Web应用的Attach Process调试。我发了另外两篇相关的帖子。如下:

通常我们通过在可能存在问题代码处加断点来启动调试。因此,我们从断点开始讲起。

3 断点(Breakpoints)

断点用于通知调试器何时何处暂停程序的执行。通过点击左边栏或者按F9键在当前行添加断点。在加断点之前,你需要知道你的代码将会出现什么错误,在什么地方停止执行。当调试器执行到断点处时,你可以使用其他的调试工具核对代码何处出现错误。


图 设置断点(Set Breakpoint)

3.1 使用断点进行调试

你已经在你想要暂停执行的地方设置了断点。现在按F5键启动调试,当程序执行到断点处时,自动暂停执行。此时你有多种方式来检查代码。命中断点(hit the breakpoint)后,加断点的行变为黄色,意指下一步将执行此行。

在中断模式下,你有多条可使用的命令,使用相应命令进行进一步的调试。


图 断点工具条(Breakpoint Toolbar)

3.1.1 逐过程(Step Over)

调试器执行到断点后,你可能需要一条一条的执行代码。”Step Over“[F10]命令用于一条一条的执行代码。这将执行当前高亮的行,然后暂停。如果在一条方法调用语句高亮时按F10,执行会停在调用语句的下一条语句上。Step Over会一次整个方法。

图: 逐过程(Step Over - F10)

3.1.2 逐语句(Step Into)

它与Step Over相似。唯一的不同是,如果当前高亮语句是方法调用,调试器会进入方法内部。快捷键是”F11“

图: 逐语句(Step Into - F11)

3.1.3 跳出(Step Out)

当你在一个方法内部调试时会用到它。如果你在当前方法内按Shift - F11,调试器会完成此方法的执行,之后在调用此方法的语句的下一条语句处暂停。

3.1.4 继续(Continue)

它像是重新执行你的程序。它会继续程序的执行直到遇到下一个断点。快捷键是”F5“

3.1.5 设置下一语句(Set Next Statement)

这是一个非常有趣的特性。设置下一语句允许你在调试的时候改变程序的执行路径。如果你的程序在某一行处暂停而且你想改变执行路径,跳到指定行,在这一行上右击,在右击菜单中选择”设置下一语句“。这样程序就会转到哪一行执行而不执行先前的代码。这在如下情况中非常有用:当你发现代码中某些行可能会导致程序的中断(break)而你不想让程序在那个时候中断。快捷键是Ctrl + Shift + F10

图: 设置下一语句(Set Next Statement)

3.1.6 显示下一语句(Show Next Statement [Ctrl+*])

这一行用黄色箭头标记。这行是程序继续执行时下一条将执行的语句。

3.2 断点标签(Labeling in Break Point)

这是VS2010提供的新特征(feature)。用于更好的管理断点。它使得我们能够更好的分组和过滤断点。这像是对断点的归类。如果我们添
加了与某一功能相关的不同类型的断点,我们可以根据需要使能(enable)、取消(disable)、过滤(filter)这些断点。例如,假设我们要
调试一下代码块。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string[] strNames = { "Name1", "Name2", "Name3", "Name4", "Name5", "Name6" };
  6. foreach (string name in strNames)
  7. {
  8. Console.WriteLine(name);   // BreakPoint
  9. }
  10. int temp = 4;
  11. for (int i = 1; i <= 10; i++)
  12. {
  13. if (i > 6)
  14. temp = 5;
  15. }
  16. }
  17. public static void Method1()
  18. {
  19. Console.WriteLine("Break Point in Method1");   // BreakPoint
  20. }
  21. public static void Method2()
  22. {
  23. Console.WriteLine("Break Point in Method2");  // BreakPoint
  24. Console.WriteLine("Break Point in Method2");  // BreakPoint
  25. }
  26. public static void Method3()
  27. {
  28. Console.WriteLine("Break Point in Method3");  // Breakpoint
  29. }
  30. }

执行程序将停在第一个断点处。下图给出了断点列表。

图: 断点列表

上图中Labels列都为空。下面介绍如何给断点设置标签(label)以及如何使用标签。只需在特定代码行的断点符号上右击(①)或者在断点窗口中设置(②)即可对任何断点设置标签。

图: 设置断点标签(Setting Breakpoint Label)

右击断点,点击编辑标签(Edit Labels),即可对任意断点添加标签。对于示例代码,我为所有断点的标签起了易于理解的名字。

图: 添加断点标签(Adding Breakpoint Label)

这些标签如何辅助我们调试呢?现在,所有断点都是使能的(enabled)。如果你不想调试method2,一般情况下你必须去对应的方法中一个一个的取消断点,但这里你可以通过标签名过滤或者搜索它们,然后选中它们以方便的取消它们。

图: 使用标签过滤断点(Filter Breakpoint Using Labels)

断点标签到此介绍完毕。我举的例子非常简单,但是断点标签在你调试大量代码,多个工程等情况下非常有用。

3.3 条件断点(Conditional Breakpoint)

假设你在多次迭代(循环)处理数据而你只想调试其中某几次迭代。这意味着你想根据某些特定条件暂停你的程序。Visual Studio断点允许你设置条件断点。当且仅当条件满足时,调试器才会停住。

首先,你需要在你想暂停执行处设置断点。然后右击红色的断点图标。右键菜单中点击”条件“。

图: 设置断点条件(Set Breakpoint Condition)

点击右键菜单中的”条件“后,会弹出下面的对话框设置断点的条件。

图: 断点条件设置

假设你要调试下面的代码块:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string [] strNames = { "Name1","Name2", "Name3", "Name4", "Name5", "Name6"};
  6. foreach(string name in strNames)
  7. {
  8. Console.WriteLine(name); // Breakpoint is here
  9. }
  10. }
  11. }

你在Console.WriteLine()语句处设置了断点。当执行程序时,每次for-each循环都会停住。如果你想让代码只在name="Name3"时停住,该怎么办呢?非常简单,你只需使用条件name.Equals("Name3")。

图: 设置断点条件

查看断点符号。它应该看上去像是一个加(+)号在断点符号内部,这表示该断点是条件断点。

图: 条件断点符号(Conditional Breakpoint Symbol)

设置断点的条件之后,在调试程序,调试器只会在满足给定条件时才停住。

图: 条件断点命中(Conditional Breakpoint hit)

条件输入框的自动补全(intellisense):上面给出的断点条件非常简单,可以非常容易的写到条件文本框中。有时你可能需要定义很大很复杂的条件。不必担心,VS为条件文本输入框也提供了自动补全功能。因此,在条件框中输入就像是在编辑器中一样方便。如下图。

图: 条件文本框的自动补全(intellisense in condition textbox)

我几乎讲解了条件断点的所有内容。除了下面这点。在条件窗口中有两个选项:

  1. Is True
  2. Has Changed

我们已经看到”Is True“选项的用途了。”Has Changed“用在当你想在某些值变为某些特定值的时候停住。

3.4 导入/导出断点(Import / Export Breakpoint)

3.5 断点命中计数(Breakpoint Hit Count)

3.6 Breakpoint When Hit

3.7 断点筛选器(Breakpoint Filter)

你可以限制断点只对特定进程或线程有效。这在进行多线程程序的调试时非常有用。右击断点选”筛选器“即可打开筛选器窗口。

图: 断点筛选器(Breakpoint Filter)

在筛选规则中,你可以设置进程名,进程Id,机器名,线程ID等。我会在多线程调试小节中详述其用法。

4 数据便签(Data Tip)

数据便签是应用程序调试期间用于查看对象和变量的一种高级便签消息。当调试器执行到断点时,将鼠标移到对象或者变量上方时,你会看到它们的当前
值。你甚至可以看到一些复杂对象(如dataset,datatable等等)的细节。数据便签左上角有一个“+”号用于展开它的子对象或者值。

图: 调试时的数据便签(DataTips During Debugging)

几个月前,我发过一篇关于VS 2010 DataTip Debugging Tips的文章。

下面是一些在调试时有用的特性。

4.1 Pin Inspect Value During Debugging

4.2 Drag-Drop Pin Data Tip

4.3 Adding Comments

4.4 Last Session Debugging Value

4.5 Import Export Data Tips

4.6 Change Value Using Data Tips

4.7 Clear Data Tips

5 监视窗口(Watch Windows)

5.1 局部变量(Locals)

列出当前方法中的所有变量。当调试器停在某特定断点并打开Autos窗口时,将展示当前范围中与此值相关的变量。

图:Local Variables

5.2 自动窗口(Autos)

这些变量由VS调试器在调试的时候自动检测。VS检测与当前语句相关的对象或变量,基于此列出Autos变量。Autos Variable的快捷键是Ctrl + D + A。

图:Autos - Ctrl + D, A

5.3 监视(Watch)

Watch窗口用于添加变量。你可以添加任意多个变量。添加方法是,右击变量并选择“Add to Watch”。

图:Watch - Ctrl + D, W

也可以使用拖放(Drag and Drop)将变量添加到监视窗口中。从监视窗口中删除变量的方法是,右击变量并选择“Delete Watch”。通过调试窗口,也可以在运行时编辑这些变量值。

有4个可同时使用的监视窗口。

图:多个监视窗口

若果变量中含有对象实例,左边会有一个“+”号用于查看对象的属性和成员。

图:展开监视变量

5.3.1 Creating Object ID

Visual Studio调试器提供另外一个强大的功能,支持我们为对象的任何一个特定实例创建一个对象ID(object
ID)。这可以用于在任何时间监控任意对象,甚至是该对象位于范围(scope)之外。在监视窗口(watch
window)右击特定对象变量,再单击“Make Object ID”即可创建Object ID。

图: 创建Object ID

在对特定对象变量创建Object ID之后,Visual Studio会给这个对象添加一个数码和“#”号,用来表示。

图:添加Object ID后

5.4

6 即时窗口(Immediate Window)

即时窗口是开发人员常用的功能。它可以在不改变当前调试步骤的情况下修改变量值或者执行一些语句。我们可以通过菜单调试 > 窗口 > 即时(Debug > Window > Immediate Window)打开即时窗口。即时窗口支持一组命令,可在调试的任何时刻执行。它也支持Intellisense。在调试期间,我们可以在即时窗口中执行任何命令或者代码语句。

图:基本即时窗口(Basic Immediate Window)

这是对所有开发人员来说最为常用的特性,因此我就不一一介绍即时窗口的每一条命令了。

7 调用堆栈(Call Stack)

8 调试多线程程序(Debugging Multithreaded Program)

8.1 Exploring Threads Window

8.2 Flag Just My Code

8.3 Break Point Filter - Multithread Debugging

9 调试并行程序(Debugging Parallel Program)

9.1 Parallel Task and Parallel Stacks

10 Debugging with IntelliTrace

10.1 Overview

10.2 Mapping with IntelliTrace

10.3 Filter IntelliTrace Data

11 调试常用快捷键(Useful Shortcut Keys For VS Debugging)

Shortcut Keys Descriptions
Ctrl-Alt-V, A Displays the Auto window
Ctrl-Alt-B Displays the Breakpoints dialog
Ctrl-Alt-C Displays the Call Stack
Ctrl-Shift-F9 Clears all of the breakpoints in the project
Ctrl-F9 Enables or disables the breakpoint on the current line of code
Ctrl-Alt-E Displays the Exceptions dialog
Ctrl-Alt-I Displays the Immediate window
Ctrl-Alt-V, L Displays the Locals window
Ctrl-Alt-Q Displays the Quick Watch dialog
Ctrl-Shift-F5 Terminates the current debugging session, rebuilds if necessary, and starts a new debugging session.
Ctrl-F10 Starts or resumes execution of your code and then halts execution when it reaches the selected statement.
Ctrl-Shift-F10 Sets the execution point to the line of code you choose
Alt-NUM * Highlights the next statement
F5 If not currently debugging, this runs the startup project or projects and attaches the debugger.
Ctrl-F5 Runs the code without invoking the debugger
F11 Step Into
Shift-F11 Executes the remaining lines out from procedure
F10 Executes the next line of code but does not step into any function calls
Shift-F5 Available in break and run modes, this terminates the debugging session
Ctrl-Alt-H Displays the Threads window to view all of the threads for the current process
F9 Sets or removes a breakpoint at the current line
Ctrl-Alt-W, 1 Displays the Watch 1 window to view the values of variables or watch expressions
Ctrl-Alt-P Displays the Processes dialog, which allows you to attach or detach the debugger to one or more running processes
Ctrl-D,V IntelliTrace Event

到此本文结束。希望你喜欢本文。请分享你的反馈和建议。

12 深入学习(Further Study)

13 总结(Summary)

本文介绍了调试过程的基本内容。介绍了如何使用VS调试一个应用程序。我解释了几乎所有重要的工具以及它们的使用方法。对于并行程序调试,我只
讲了基础部分。在深入学习小节中,深入讲解了并行调试过程。如果你感兴趣,请阅读。我的主要目的是涵盖Visual
Studio中提供的几乎所有调试工具。希望你从本文中学到了一些新知识。

“自动窗口”(Autos):当前使用的变量

“局部窗口”(Locals):在范围内的所有变量

“监视N”(Watch):可定制(N从1到4)

Step Into(逐语句):执行并移动到下一条语句(实际上,跳入上一条语句的代码块,此代码块的第一条)

Step Over(逐过程):执行并跳到下一条语句,但不进入上一条语句的代码块

Step Out(跳出):执行到代码块结尾

命令窗口(Command)

即时窗口(Immediate):主要用于计算表达式

参考资料:

[1] Mastering Debugging in Visual Studio 2010 - A Beginner‘s Guide

[2] bug和缺陷的区别

时间: 2024-10-17 02:14:06

VS2010调试 --指南 Reference from : http://blog.csdn.net/kingzone_2008/article/details/8133048的相关文章

Win10双击调试 转载 http://blog.csdn.net/sagittarius_warrior/article/details/51305046

转:注1:本文非本人所写,尊重原作者劳动成果.仅是对原文备份. http://blog.csdn.net/sagittarius_warrior/article/details/51305046(原来链接出处) 注2:最近在双击调试,需要配置双击调试环境,经尝试,原作者提供的方法可行,故转载备份一张,方便记忆,再次感谢原作者,及李Sir( http://www.cnblogs.com/lzjsky/archive/2010/12/14/1905248.html),希望他们不要来打我,汗 本文章已

Windows下QT4.8.4编译环境的搭建(转载http://blog.csdn.net/bestgonghuibin/article/details/38933141)

开始使用QT了,所以第一步就是把环境搭起来,这里小记一下,以免以后忘记. 1. 下载安装文件 要使用QT功能,那么必须要下载QT的源码,还必须要一个是用QT的编译环境,可以是VS2010,也可以是专用于QT编程的QT Creator.本人选择QT Creator,所以也必须要下载QT Creator. 根据网上大部分教程及自己买的书籍获取的信息,在选择版本的时候,QT 源码选择4.8.4,而QT Creator选择2.8.0(QT5.0以后许多原有的文件路径改变). 选择好版本之后,可以上QT的

Win32消息循环机制等【转载】http://blog.csdn.net/u013777351/article/details/49522219

Dos的过程驱动与Windows的事件驱动 在讲本程序的消息循环之前,我想先谈一下Dos与Windows驱动机制的区别: DOS程序主要使用顺序的,过程驱动的程序设计方法.顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序.虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构. 而Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程

http://blog.csdn.net/LANGXINLEN/article/details/50421988

GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时候,无意中发现了 @Trinea在GitHub上的一个项目 Android开源项目分类汇总, 由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫的界面特效设计.个性化控件.工具库.优秀的Android 开源项目.开发测试工具.优秀个人和团体等.可以这样说,每一位Andorid开发人员都能从中找到一个或多个适用自己项目的解决方案,消化吸收并加以利 用,可以为自己的APP增色不少.文章最后还

Cassandra研究报告-http://blog.csdn.net/zyz511919766/article/details/38683219/

转自http://blog.csdn.net/zyz511919766/article/details/38683219/ 1基本安装 1.1在基于RHEL的系统中安装Cassandra 1.1.1必要条件 Ø  YUM包管理器 Ø  Root或sudo权限 Ø  JRE6或者JRE7 Ø  JNA(Java native Access)(生产环境需要) 1.1.2步骤 Ø  安装配置JRE(略) Ø  添加软件包仓库到YUM的软件库 将以下内容添加进/etc/yum.repos.d/datas

PL/SQL常用设置 可看引用位置更清晰直观 引自:http://blog.csdn.net/xiaoqforever/article/details/27695569

引自:http://blog.csdn.net/xiaoqforever/article/details/27695569 1,登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables目录,正常情况都需要Wait几秒钟,而选择My Objects后响应速率则是以毫秒计算的. Tools菜单 --> Object Brower Filters,会打开Brower Folders

学习mongoDB的一些感受(转自:http://blog.csdn.net/liusong0605/article/details/11581019)

曾经使用过mongoDB来保存文件,最一开始,只是想总结一下在开发中如何实现文件与mongoDB之间的交互.在此之前,并没有系统的了解过mongoDB,虽然知道我们用它来存储文件这些非结构化数据,但是,对于为什么用它存储文件类型的数据以及其存储原理还是不清楚的,甚至说连mongoDB是什么以及它的一些基本概念都不知道.所以,先从宏观入手,本着它是什么,有什么特点,怎么产生,能做什么,怎么用这几步来逐步深入的学习. 经过一些列的博客之后,这是最后我做的一个总结: 经过这一段时间的学习,我发现mon

xcode5.1.1安装iOS6.1模拟器 -----转载自http://blog.csdn.net/forestml2008/article/details/21714259

Xcode5.1默认不支持iOS5版本的模拟器开发调试,在OS X Mavericks(10.9.x)下默认只能支持iOS6.1及以上版本的模拟器,在OS X Mountain Lion(10.8.x)下默认只能支持iOS6.0及以上版本的模拟器进行开发和调试,在此条件之下的版本只能使用硬件设备进行开发调试.虽然现在低版本的iOS设备越来越少了,但是有时客户的需求可能会要求我们一定要兼容iOS5(或更低版本)及以上版本,如果我们手头找不到低版本硬件设备用于调试或者完全使用硬件设备而没有对应的模拟

推荐一些C#相关的网站、资源和书籍 (转载自http://blog.csdn.net/chinacsharper/article/details/17514923)

一.网站 1.http://msdn.microsoft.com/zh-CN/ 微软的官方网站,C#程序员必去的地方.那里有API开发文档,还有各种代码.资源下载. 2.http://social.msdn.microsoft.com/Forums/zh-CN/home 微软msdn论坛.定位于微软技术的传播和技术问题的解决,是学习微软技术的好去处. 3.http://www.codeproject.com/ 国外著名的社区网站,面向世界的程序员.有很多不错的程序都可以从那里下载到. 4.htt