`
sjk2013
  • 浏览: 2182436 次
文章分类
社区版块
存档分类
最新评论

掌握VS2010调试 -- 入门指南

 
阅读更多

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会一次整个方法。
debug51
图: 逐过程(Step Over - F10)

3.1.2 逐语句(Step Into)

它与Step Over相似。唯一的不同是,如果当前高亮语句是方法调用,调试器会进入方法内部。快捷键是”F11“
debug52
图: 逐语句(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
debug3_small
图: 设置下一语句(Set Next Statement)

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

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

3.2 断点标签(Labeling in Break Point)

这是VS2010提供的新特征(feature)。用于更好的管理断点。它使得我们能够更好的分组和过滤断点。这像是对断点的归类。如果我们添加了与某一功能相关的不同类型的断点,我们可以根据需要使能(enable)、取消(disable)、过滤(filter)这些断点。例如,假设我们要调试一下代码块。
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
图: 断点列表
上图中Labels列都为空。下面介绍如何给断点设置标签(label)以及如何使用标签。只需在特定代码行的断点符号上右击(①)或者在断点窗口中设置(②)即可对任何断点设置标签。
debug12_small
图: 设置断点标签(Setting Breakpoint Label)
右击断点,点击编辑标签(Edit Labels),即可对任意断点添加标签。对于示例代码,我为所有断点的标签起了易于理解的名字。
debug13
图: 添加断点标签(Adding Breakpoint Label)
这些标签如何辅助我们调试呢?现在,所有断点都是使能的(enabled)。如果你不想调试method2,一般情况下你必须去对应的方法中一个一个的取消断点,但这里你可以通过标签名过滤或者搜索它们,然后选中它们以方便的取消它们。
debug14_small
图: 使用标签过滤断点(Filter Breakpoint Using Labels)
断点标签到此介绍完毕。我举的例子非常简单,但是断点标签在你调试大量代码,多个工程等情况下非常有用。

3.3 条件断点(Conditional Breakpoint)

假设你在多次迭代(循环)处理数据而你只想调试其中某几次迭代。这意味着你想根据某些特定条件暂停你的程序。Visual Studio断点允许你设置条件断点。当且仅当条件满足时,调试器才会停住。
首先,你需要在你想暂停执行处设置断点。然后右击红色的断点图标。右键菜单中点击”条件“。
debug5_small
图: 设置断点条件(Set Breakpoint Condition)
点击右键菜单中的”条件“后,会弹出下面的对话框设置断点的条件。
debug6
图: 断点条件设置
假设你要调试下面的代码块:
class Program
    {
        static void Main(string[] args)
        {
         string [] strNames = { "Name1","Name2", "Name3", "Name4", "Name5", "Name6"};

            foreach(string name in strNames)
            {
                 Console.WriteLine(name); // Breakpoint is here
            }
        }
    }
你在Console.WriteLine()语句处设置了断点。当执行程序时,每次for-each循环都会停住。如果你想让代码只在name="Name3"时停住,该怎么办呢?非常简单,你只需使用条件name.Equals("Name3")。
debug7
图: 设置断点条件
查看断点符号。它应该看上去像是一个加(+)号在断点符号内部,这表示该断点是条件断点。
debug9
图: 条件断点符号(Conditional Breakpoint Symbol)
设置断点的条件之后,在调试程序,调试器只会在满足给定条件时才停住。
debug10
图: 条件断点命中(Conditional Breakpoint hit)
条件输入框的自动补全(intellisense):上面给出的断点条件非常简单,可以非常容易的写到条件文本框中。有时你可能需要定义很大很复杂的条件。不必担心,VS为条件文本输入框也提供了自动补全功能。因此,在条件框中输入就像是在编辑器中一样方便。如下图。
debug8_small
图: 条件文本框的自动补全(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)

你可以限制断点只对特定进程或线程有效。这在进行多线程程序的调试时非常有用。右击断点选”筛选器“即可打开筛选器窗口。
debug40
图: 断点筛选器(Breakpoint Filter)
在筛选规则中,你可以设置进程名,进程Id,机器名,线程ID等。我会在多线程调试小节中详述其用法。

4 数据便签(Data Tip)

数据便签是应用程序调试期间用于查看对象和变量的一种高级便签消息。当调试器执行到断点时,将鼠标移到对象或者变量上方时,你会看到它们的当前值。你甚至可以看到一些复杂对象(如dataset,datatable等等)的细节。数据便签左上角有一个“+”号用于展开它的子对象或者值。
debug20
图: 调试时的数据便签(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窗口时,将展示当前范围中与此值相关的变量。
debug30_small
图:Local Variables

5.2 自动窗口(Autos)

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

5.3 监视(Watch)

Watch窗口用于添加变量。你可以添加任意多个变量。添加方法是,右击变量并选择“Add to Watch”。
debug32_small
图:Watch - Ctrl + D, W
也可以使用拖放(Drag and Drop)将变量添加到监视窗口中。从监视窗口中删除变量的方法是,右击变量并选择“Delete Watch”。通过调试窗口,也可以在运行时编辑这些变量值。

有4个可同时使用的监视窗口。
debug33_small
图:多个监视窗口

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

5.3.1 Creating Object ID

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

5.4

6 即时窗口(Immediate Window)

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


分享到:
评论

相关推荐

    掌握VS2010调试 -- 入门指南.pdf

    VS调试指南

    掌握VS2010调试--入门指南(完整译版)

    对于初学者是十分有帮助的

    Python编程入门指南学习资源、基础语法和实践建议

    Python入门指南:学习的第一步是一份针对初学者的综合性学习资源,旨在帮助初学者快速入门Python编程。该资源提供了丰富的学习内容,包括学习资源推荐、基本语法和常用函数的介绍,以及编程实践建议。 学习资源推荐...

    Python开发环境搭建+PyCharm+下载安装配置教程+入门指南

    4. 使用PyCharm进行代码编写、调试和运行 5. PyCharm的常用功能和插件介绍 本资料内容全面,结构清晰,从PyCharm的下载到安装、配置,再到项目创建和代码编写,手把手教你搭建自己的Python开发环境。此外,我们还...

    AWS-Lambda-Quick-Start-Guide:Packt发布的《 AWS Lambda快速入门指南》

    AWS Lambda快速入门指南 这是Packt发布的的代码存储库。 了解如何在AWS上构建和部署无服务器应用程序 这本书是关于什么的? AWS Lambda是AWS的一部分,可让您运行代码而无需置备或管理服务器。 这使您能够部署...

    打败Linux系统中的Bug

    对于刚接触Linux的大型机开发人员,掌握新的调试工具似乎是一项令人畏惧的任务。不要害怕。本文将提供一些有用的提示来帮助您入门。学问来自实践,但是对于调试工具,在没有出现问题而迫使您去修复它们之前,“实践...

    ARM指令集仿真环境搭建资料含教程说明

    本文档旨在为初学者提供一个快速入门的指南,帮助他们掌握ARM指令集仿真环境的搭建和使用方法。本文档不涉及ARM指令集的详细介绍和分析,也不涉及ARM汇编语言的高级特性和技巧。如果想要深入学习ARM指令集和汇编语言...

    Fortran编程全面指南.docx

    我们将介绍Fortran的基础语法,通过案例和项目资源,帮助您快速入门并掌握Fortran的应用。 Fortran语言基础 环境搭建 选择编译器:Fortran代码需要使用编译器进行编译和执行。常用的编译器包括GNU Fortran...

    迪文屏开发指南T5LDGUS开发指南

    本书适用于希望在该平台上进行应用开发的开发人员和工程师,旨在帮助读者快速入门并掌握相关技能。 本书内容包括: T5L DGUSII 平台概述:介绍 T5L DGUSII 平台的特点、优势和应用场景,帮助读者了解该平台的基本...

    ACE基础学习资料电子版

    001-C++网络编程 卷1 运用ACE和模式消除复杂性 002-C++网络编程 卷2 基于ACE和框架的系统化复用 003-ACE程序员指南 ...从上到下对这次书籍进行阅读,然后同步调试代码,基本是6个月左右就可以掌握一般服务器级别的应用

    Matlab语言指南.docx

    我们将介绍Matlab的基础语法,通过案例和项目资源,帮助您快速入门并掌握Matlab的应用。 Matlab语言基础 环境搭建 安装Matlab:从MathWorks官网获取Matlab安装程序,并按照指示进行安装。 了解Matlab环境:Matlab...

    asp.net知识库

    delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18 的算法(C#) 一组 正则表达式 静态构造函数 ...

    learn-os:操作系统学习指南

    OS 学习指南 项目尚未完成 本项目尝试教你从工程角度学习 操作系统(Operating System) 开发。包括编译工具链、开发语言、以及 OS 相关知识。 前言 预备知识 本项目不是一个关于如何入门编程的书。它(至少)面向...

    Ext JS权威指南

    第3章详细讲解了调试的工具及技巧,这是本书的重要内容,希望所有web开发者都能掌握;第4章全面介绍了ext js的基础架构;第5~9章分别讲解了ext js的事件及其应用、选择器与dom操作、数据交互、模板与组件、容器、...

    Access2000VBA一册通

    绍了VBA 的基本语法包括数据类型语句函数过程调试等基 础内容方便用户掌握VBA 语言第三部分主要介绍了应用程序的高 级开发其中讲述了许多开发应用程序的高级技术帮助用户掌握开 发应用程序的方法本书的目标是为利用...

    vc++ 开发实例源码包

    freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 如题。 FTP、HTTP 多线程断点续传下载文件 源码 如题。 gdiplus应用实例 如题,自绘控件的实现。 gdiplus应用实例2 如题,自绘控件的实现。 ...

    C语言中的文件读写全解析,学习C语言的15个黄金建议.zip

    内容关键词: 打开文件, 读取数据, 写入数据, 关闭文件, 初学者指南, 学习建议, 实践技巧, 模块化编程 用途: 适用于编程初学者及希望提升C语言技能的开发者,帮助学习者通过具体实例理解C语言的文件操作过程...

    PowerBuilder 8.0入门与提高(高清中文版)

    本书为PowerBuilder8.0提供了一套完整的指南,使读者如同身临其境快速掌握并熟练操作这一数据库开发平台,开发各种功能强大的数据库管理系统。 本书内容翔实、结构严谨、示例丰富,相信不论你是PowerBuilder 8.0的...

    2018 猎豹网校 教程大全 资源难找赶紧保存吧

    猎豹网校 快速掌握 C# 学习指南[MP4] 猎豹网校 快速掌握 Access VBA[MP4] 猎豹网校 快速学会_Windows 命令行批处理脚本[MP4] 猎豹网校 快速学会_Shell 脚本经典教程[MP4] 猎豹网校 快速学会 VB.NET 经典教程[MP4...

    MODBUS软件实战.zip

    让广大在校学生、工业控制和自动化工程师及技术人员了解 Modbus协议的内涵,特别是彻底掌握 Modbus通信 技术的软件开发方法,作者从初学者的角度,由浅入深循循善诱,以文字和画面相结合的方式撰写了本书。 本书分为11章...

Global site tag (gtag.js) - Google Analytics