在VS2010中调试项目时,经常需要观察相同变量名在不同代码中的位置。默认情况下,VS双击某个变量名,其他相同的变量名不会高亮或者显示不清晰,如下图变量名uiBit所示。为了方便调试,可以在VS下设置。具体流程如下:
第1步:
? ? ?首先,在VS菜单栏中选择“工具”--->“选项”--->“环境”--->“字体和颜色”,在右侧选项的显示项中找到VA Find Reference,设置将项目背景设置为自己喜欢的颜色,这里设置为红色,具体过程如下图:
第2步:
? ? ?首先在VS菜单栏选择“工具”--->“选项”--->“环境”--->“字体和颜色”,在右侧显示项中找到VA Find Reference(已修改)选项,表示修改后的参考。将项目背景设置为您喜欢的颜色,这里设置为浅绿色。具体流程如下图:
?设置完成后,双击选择变量名uiBit。效果如下。如果需要取消显示,可以直接按键盘左上角的退出键“Esc”:
1 简介
在软件开发周期中,测试和纠正缺陷(缺陷,缺陷与bug的区别:Bug是缺陷的一种表现,一个缺陷可以导致多个bug)所花费的时间远远多于编写代码的时间。通常,调试是指发现缺陷并纠正它们的过程。修复缺陷之后进行调试,或者两者是相关的。如果代码中存在缺陷,我们首先需要找出缺陷的根本原因。这个过程称为调试。一旦找到根本原因,就可以纠正缺陷。
那么如何调试代码呢? Visual Studio 提供了许多用于调试的工具。有时调试需要花费大量时间才能确定根本原因。 VS提供了很多方便的工具来辅助调试。调试器包括错误列表、添加断点、可视化程序流程、控制执行流程、数据提示、监视窗口、多线程调试、线程窗口、并行调试概述和 IntelliTrace 调试概述。希望本文能够对调试功能的用户有所帮助。请注意,本文使用VS2010。一些功能在旧版本中是一致的,但 VS2010 添加了许多新功能(标记断点、固定数据提示、多线程调试、并行调试和 IntelliTrace)。
2 如何开始调试?
可以通过VS的“调试”菜单开始调试。点击调试菜单下的“开始调试”或按F5键启动。如果您在代码中添加了断点,执行将自动开始。
图开始调试
“附加到进程”是另一种开始调试的方法。 Attach Process 启动应用程序的调试会话。也许我们更熟悉 www.gsm-guard.net Web 应用程序的 Attach Process 调试。我还发表了另外两篇相关帖子。如下:
调试托管在 IIS 上的 www.gsm-guard.net 应用程序 远程 IIS 调试:调试托管在“远程 IIS 服务器”上的 www.gsm-guard.net 应用程序
通常我们通过在可能存在问题的代码处添加断点来开始调试。那么让我们从断点开始。
3 个断点
断点用于告诉调试器何时何地暂停程序执行。通过单击左列或按 F9 键在当前行添加断点。在添加断点之前,您需要知道代码中会出现哪些错误以及执行将在哪里停止。当调试器到达断点时,您可以使用其他调试工具来检查代码中发生错误的位置。
图形设置断点
3.1 使用断点调试
您已在要暂停执行的位置设置了断点。现在按F5键开始调试。当程序到达断点时,执行将自动暂停。此时,您可以通过多种方法来检查代码。命中断点后,断点所在行变为黄色,表示接下来将执行该行。
在中断模式下,您有多个可用命令。使用相应的命令进行进一步的调试。
图断点工具栏
3.1.1 越过
调试器到达断点后,您可能需要逐条执行代码。
“Step Over”[F10]命令用于逐条执行代码。这将执行当前突出显示的行,然后暂停。如果在方法调用语句突出显示时按 F10,执行将在调用语句后面的语句处停止。 Step Over 将立即执行整个方法。
图片:跨过 - F10
3.1.2 进入
与 Step Over 类似。唯一的区别是,如果当前突出显示的语句是方法调用,则调试器将进入该方法。快捷键是
“F11”。
图:步入-F11
3.1.3 退出
当您在方法内部进行调试时使用。如果您在当前方法中按
Shift - F11,调试器完成该方法的执行,然后在调用该方法的语句后面的语句处暂停。
3.1.4 继续
这就像重新执行你的程序。它继续程序执行,直到遇到下一个断点。快捷键是
“F5”。
3.1.5 设置下一条语句
这是一个非常有趣的功能。设置下一个语句可以让您
更改程序的执行路径。如果你的程序在某一行暂停并且你想改变执行路径,
跳转到指定行,在该行上单击鼠标右键,在右键菜单中选择“”
设置下一个语句”。这将导致程序跳转到该行执行,而不执行前面的代码。这在以下情况下非常有用:当您发现代码中的某些行可能导致程序中断时(break) 并且你不希望程序在此时中断。快捷键是
Ctrl + Shift + F10。
图:设置下一条语句
3.1.6 显示下一条语句 [Ctrl+*])
该线标有黄色箭头。该行是程序继续执行时将执行的下一条语句。
3.2 断点标记
这是VS2010提供的新功能。为了更好地管理断点。它使我们能够更好地分组和过滤断点。这就像对断点进行分类。如果我们添加与某个功能相关的不同类型的断点,我们可以根据需要启用、禁用和过滤这些断点。例如,假设我们要调试一段代码。
[csharp]?
查看平原
?复制
课程?节目?? ????{?? ?????????static?void?Main(string[]?args)?? ?????????{?? ????????????string[]?strNames?=?{?"Name1",?"Name2",?"Name3",?"Name4",?"Name5",?"Name6" ?};?? ?? ????????????foreach?(字符串?名称?in?strNames)? ????????????{?? ???????????????Console.WriteLine(name);???//?BreakPoint?? ????????????}?? ????????????int?temp?=?4;?? ????????????for?(int?i?=?1;?i?<=?10;?i++)?? ????????????{?? ????????????????if?(i?>?6)?? ????????????????????? 温度 ?=?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");??//?断点?? ?????????}?? ?????}??
程序的执行将在第一个断点处停止。下图给出了断点列表。
图片:断点列表
在上图中,标签栏为空。下面介绍如何设置断点标签以及如何使用标签。您可以为任何断点设置标签,只需右键单击特定代码行的断点符号 (①) 或在断点窗口中设置它 (②)。
图片:设置断点标签
右键单击断点,然后单击编辑标签可为任意断点添加标签。对于示例代码,我为所有断点标签指定了易于理解的名称。
图片:添加断点标签
这些标签如何帮助我们调试?现在,所有断点均已启用。如果不想调试方法二,通常需要在相应的方法中一一取消断点,但这里可以通过标签名称过滤或搜索断点,然后选择它们,就可以方便地取消。
图:使用标签过滤断点
断点标签的介绍到此结束。我给出的例子很简单,但是当你调试大量代码、多个项目等时,断点标签非常有用。
3.3 条件断点
假设您正在多次迭代(循环)中处理数据,并且您只想调试某些迭代。这意味着您想要根据某些特定条件暂停您的程序。 Visual Studio 断点允许您设置条件断点。当且仅当满足条件时调试器才会停止。
首先,您需要在要暂停执行的位置设置断点。然后右键单击红色断点图标。单击右键菜单中的“条件”。
图:设置断点条件
点击右键菜单中的“条件”后,会弹出如下对话框,设置断点条件。
图片:断点条件设置
假设您要调试以下代码块:
[csharp]?
查看平原
?复制
课程?节目?? ????{?? ?????????static?void?Main(string[]?args)?? ?????????{?? ?? ??????string?[]?strNames?=?{?"Name1","Name2",?"Name3",?"Name4",?"Name5",?"Name6"};?? ? ????????????foreach(字符串?名称?in?strNames)?? ????????????{?? ?????????? ??????Console.WriteLine(name);?//?断点?在?这里?? ?????????}?? ??????}? ??????}???
您在 Console.WriteLine() 语句处设置断点。执行程序时,每个for-each循环都会停止。如果您希望代码仅在 name="Name3" 时停止怎么办?很简单,你只需使用条件name.Equals("Name3")。
图片:设置断点条件
查看断点符号。它应该看起来像断点符号内的加号 (+),这表明该断点是条件断点。
图:条件断点符号
设置断点的条件后,调试程序时,只有满足给定的条件时,调试器才会停止。
图片:条件断点命中
条件输入框自动补全(智能感知):上面给出的断点条件非常简单,可以很方便地写入条件文本框。有时您可能需要定义大型且复杂的条件。别担心,VS还提供了条件文本输入框的自动补全功能。因此,在条件框中键入就像在编辑器中一样简单。如下所示。
图:条件文本框自动补全(条件文本框智能感知)
我几乎涵盖了有关条件断点的所有内容。除了这个。条件窗口中有两个选项:
是真的已经改变了
我们见过
这就是“为真”选项的目的。
“已更改”用于当某些值更改为某些特定值时想要停止时。
3.4 导入/导出断点
3.5 断点命中计数
3.6 命中时断点
3.7 断点过滤器
您可以将断点限制为仅特定进程或线程。这在调试多线程程序时非常有用。右键单击断点并选择
单击“过滤器”打开过滤器窗口。
图:断点过滤器
过滤规则中可以设置进程名、进程ID、机器名、线程ID等,具体使用方法我会在多线程调试章节详细介绍。
4 数据提示
Data Sticky 是一种高级粘性消息,用于在应用程序调试期间查看对象和变量。当调试器到达断点时,当您将鼠标移动到对象或变量上时,您将看到它们的当前值。您甚至可以看到一些复杂对象(例如数据集、数据表等)的详细信息。数据注释的左上角有一个“+”号,用于展开其子对象或值。
图片:调试期间的数据提示
几个月前,我发表了一篇关于
的文章VS 2010 DataTip 调试技巧文章。
以下是调试时有用的一些功能。
4.1 调试时引脚检查值
4.2 拖放引脚数据提示
4.3 添加评论
4.4 上次会话调试值
4.5 进出口数据提示
4.6 使用数据提示更改值
4.7 清除数据提示
5 个观看窗口
5.1 当地人
列出当前方法中的所有变量。当调试器停在特定断点并打开 Autos 窗口时,将显示当前作用域中与该值相关的变量。
图片:局部变量
5.2 自动
VS 调试器在调试过程中会自动检测到这些变量。 VS 检测与当前语句相关的对象或变量,并据此列出 Autos 变量。自动变量的快捷键是 Ctrl + D + A。
图片:自动 - Ctrl + D、A
5.3 观看
监视窗口用于添加变量。您可以根据需要添加任意数量的变量。要添加,请右键单击该变量并选择“添加到监视”。
图片:观看 - Ctrl + D、W
还可以使用拖放将变量添加到监视窗口。要从监视窗口中删除变量,请右键单击该变量并选择“删除监视”。这些变量值也可以在运行时通过调试窗口进行编辑。
有4个监控窗口可以同时使用。图:多个监控窗口
如果变量包含对象实例,左侧会有“+”号,可以查看该对象的属性和成员。
图:展开监控变量
5.3.1 创建对象 ID
Visual Studio 调试器提供了另一个强大的功能,它允许我们为任何特定的对象实例创建对象 ID(对象 ID)。这可用于随时监视任何对象,即使该对象位于范围之外。右键单击监视窗口中的特定对象变量,然后单击“
创建对象 ID”以创建对象 ID。
图:创建对象ID
为特定对象变量创建对象 ID 后,Visual Studio 会向该对象添加一个数字和“#”号来表示它。
图片:添加Object ID后
5.4?
6 立即窗口
立即窗口是开发人员中常用的功能。它可以修改变量值或执行一些语句,而不改变当前的调试步骤。我们可以通过菜单来做到这一点
调试 > 窗口 > 立即窗口打开立即窗口。立即窗口支持一组可以在调试时随时执行的命令。它还支持智能感知。在调试过程中,我们可以在立即窗口中执行任何命令或代码语句。
图片:基本即时窗口
这是所有开发人员最常见的功能,因此我不会一一介绍立即窗口中的每个命令。
7 调用堆栈
8 调试多线程程序
8.1 探索线程窗口
8.2 仅标记我的代码
8.3 断点过滤器-多线程调试
9 调试并行程序
9.1 并行任务和并行堆栈
10 使用 IntelliTrace 进行调试
10.1 概述
10.2 使用 IntelliTrace 进行映射
10.3 过滤 IntelliTrace 数据
VS 调试的 11 个实用快捷键
快捷键 说明 Ctrl-Alt-V、A 显示“自动”窗口 Ctrl-Alt-B 显示“断点”对话框 Ctrl-Alt-C 显示调用堆栈 Ctrl-Shift-F9 清除项目中的所有断点 Ctrl- F9 启用或禁用当前代码行上的断点 Ctrl-Alt-E 显示“例外”对话框 Ctrl-Alt-I 显示立即窗口 Ctrl-Alt-V、L 显示本地窗口 Ctrl-Alt-Q 显示快速监视对话框 Ctrl-Shift-F5 终止当前调试会话,必要时重建,并启动新的调试会话。 Ctrl-F10 开始或恢复执行代码,然后在到达所选语句时停止执行。 Ctrl-Shift-F10 将执行点设置为您选择的代码行 Alt-NUM * 突出显示下一条语句 F5 如果当前未进行调试,则这会运行一个或多个启动项目并附加调试器。 Ctrl-F5 运行代码而不调用调试器 F11 单步执行 Shift-F11 执行过程中的剩余行 F10 执行下一行代码,但不单步执行任何函数调用 Shift-F5 在中断和运行模式下可用,这将终止调试会话 Ctrl-Alt-H 显示“线程”窗口以查看所有线程当前进程的线程数 F9 在当前行设置或删除断点 Ctrl-Alt-W, 1 显示 Watch 1 窗口以查看变量或监视表达式的值 Ctrl-Alt-P 显示 Processes 对话框,该对话框允许您可以将调试器附加或分离到一个或多个正在运行的进程 Ctrl-D,V IntelliTrace 事件 到此本文结束。希望您喜欢本文。请分享您的反馈和建议。
12 研究学习(Further Study)
在 Visual Studio 2010 中调试基于任务的并行应用程序 作者:Daniel Moth 和 Stephen Toub 使用 IntelliTrace 进行调试
13 总结(总结)
本文介绍了调试过程的基础知识。介绍如何使用VS调试应用程序。我解释了几乎所有重要的工具以及如何使用它们。对于并行程序调试,我只讲了基础部分。在深入学习部分,深入讲解了并行调试过程。如果您有兴趣,请阅读。我的主要目的是涵盖 Visual Studio 中几乎所有可用的调试工具。希望您从本文中学到新东西。
“自动”:当前使用的变量
“Locals”:
范围内的所有变量“Watch N”(手表):可自定义(N 从 1 到 4)
Step Into:执行并移至下一条语句(实际上是跳转到上一条语句的代码块,即本代码块的第一个)
Step Over:执行并跳转到下一条语句,但不进入上一条语句的代码块
Step Out:执行到代码块末尾
命令窗口(命令)
立即窗口(Immediate):主要用于计算表达式
参考:
[1]?掌握 Visual Studio 2010 中的调试 - 初学者指南
[2]?bug 和缺陷的区别
来自: http://www.gsm-guard.net/kingzone_2008/article/details/8133048
在VS2010/MFC中,很明显MessageBox()的用法与VC6.0中有所不同。
今天使用MessageBox()函数时,使用VC6.0的方法好像不行,
经过各种尝试,找到了一种比较简单的变量显示方式,分享给大家。
//VS/MFC中MessageBox的用法//(1),弹出编号CString msg; msg.Format(_T("页数:%d\n"), nPageCount);消息框(msg); //(2)、弹出字符串CString str; str.SetString(_T("asdfasdf"));消息框(str);
Format 函数不能直接用来转换字符串然后在 VS2010 中显示,
项目中默认字符集是UNICODE,使用_T转换
char a[128] = "这是一个字符串";
str.Format(_T("%s"),a);
不会提示错误,但字符串不会转换为UNICODE或ASCII
显示会异常。