Visual Studio 包含一组功能强大的集成项目生成和调试工具。 本文介绍了 Visual Studio 如何使用生成输出、代码分析、调试工具和单元测试来帮助查找代码中的问题。
你已经了解了编辑器并创建了一些代码。 现在,你想要确保代码正常工作。 在 Visual Studio 中,与大多数 IDE 一样,有两个阶段可用于使代码正常工作:生成代码以捕获和解决项目和编译器错误,以及运行代码来查找运行时和动态错误。
生成代码
有两种基本类型的生成配置: 调试 和 发布。 调试配置会生成一个较慢、更大的可执行文件,以便获得更丰富的交互式运行时调试体验。 调试 可执行文件不应分发。 发布配置生成一个更快速、经过优化的可执行文件,该可执行文件适合交付(至少从编译器的角度来看)。 默认生成配置为 Debug。
生成项目的最简单方法是按 F7,但也可以从主菜单中选择 “生成>生成解决方案 ”来启动生成。
可以在 Visual Studio UI 底部的 “输出 ”窗口中观察生成过程(用户界面)。 此处显示了错误、警告和生成操作。 如果出现错误(或者在配置级别以上有警告),则构建将失败。 您可以选择错误和警告,直接跳转到发生错误的行。 再次按 F7 (仅重新编译包含错误的文件)或 Ctrl+Alt+F7 (用于干净且完整的重建)重建项目。
编辑器下方的结果窗口中有两个选项卡式窗口: “输出 ”窗口,其中包含原始编译器输出(包括错误消息):和 “错误列表 ”窗口,该窗口提供所有错误和警告的可排序和可筛选列表。
生成成功后,可在 “输出” 窗口中看到如下所示的结果:
查看错误列表
除非对之前且已成功编译的代码进行了任何修改,否则可能存在错误。 如果你刚开始学习编程,可能会有很多疑问。 错误有时是显而易见的,例如简单的语法错误或不正确的变量名称,有时它们很难理解,只有一个神秘的代码来指导你。 要更简洁地查看问题,请导航到“生成 输出”窗口底部,然后选择“错误列表”选项卡。这样操作可以让你更有序地查看项目中的错误和警告,并提供一些额外的选项。
在 “错误列表 ”窗口中选择错误行以跳转到发生错误的行。 (或按 Ctrl+Q 打开行号,键入 行号,然后从结果中选择 打开或关闭行号。此操作是进入“选项”对话框的最快方法,在其中可以打开行号。)
按 Ctrl+G 快速跳转到发生错误的行号。
Visual Studio 使用红色的“波浪线”下划线标识此错误。 将鼠标悬停在它上方以获取更多详细信息。 修复错误,它便会消失,但你可能会在纠正时引入新的错误。 (此行为称为“回归”。)
浏览错误列表并解决代码中的所有错误。
详细审查错误
许多错误可能对你没有意义,因为它们是按照编译器的术语来表达的。 在这些情况下,可能需要其他信息。 在“错误列表”窗口中,您可以选择通过必应自动搜索获取有关错误或警告的更多信息。 右键单击相应的条目行,然后从上下文菜单中选择“显示错误帮助”,或在错误列表的“代码”列中选择超链接错误代码值。
根据设置,Web 浏览器显示错误代码和文本的搜索结果,或者在 Visual Studio 中打开一个选项卡,并显示必应搜索的结果。 结果来自互联网的许多不同来源,你可能发现并非所有都对你有用。
使用代码分析
代码分析器查找可能导致运行时错误或代码管理中出现问题的常见代码问题。
C# 和 Visual Basic 代码分析
Visual Studio 包含一组内置的 .NET 编译器平台分析器 ,用于在键入时检查 C# 和 Visual Basic 代码。 可以将更多分析器安装为 Visual Studio 扩展或 NuGet 包。 如果发现规则违规,则会在错误列表和代码编辑器中报告,并在违规代码下以波浪线显示。
C++ 代码分析
若要分析C++代码,请运行 静态代码分析。 在清理了阻止成功构建的明显错误后,养成运行该程序的习惯,并花时间解决它可能产生的警告。 通过这样做,你可以避免未来的麻烦,并且可能会学习一些代码风格技巧。
按 Alt+F11 (或从顶部菜单中选择“ 分析>解决方案上的运行代码分析 ”)开始静态代码分析。
任何新的或更新的警告都显示在 IDE 底部的“ 错误列表 ”选项卡中。 选择一个警告以在代码中跳转到相应位置。
使用快速操作来修复或重构代码
通过灯泡或螺丝刀图标提供的快速操作功能,可以重构代码在线。 它们是在 C#、C++ 和 Visual Basic 代码中快速有效地修复常见警告的一种简单方法。 若要访问它们,请右键单击警告波浪线,然后选择 快速操作和重构。 或者,如果光标位于带有彩色波浪线的行上,请按 Ctrl+。 或选择边距中的灯泡、错误灯泡或螺丝刀图标。 然后,Visual Studio 会显示可应用于该代码行的可能修复或重构的列表。
可以在代码分析器确定有修复、重构或改进代码的机会时使用快速操作。 选择任意代码行,右键单击打开上下文菜单,然后选择快速操作和重构。 如果重构或改进选项可用,则会显示它们。 否则, 此处没有可用的快速作 的消息显示在 IDE 的左下角。
凭借经验,您可以快速使用箭头键和 Ctrl+。寻找简单的重构机会并清理代码!
运行代码清理
Visual Studio 通过编辑器底部的“代码清理”按钮提供 C# 代码文件的按需格式,包括代码样式首选项。
除了为空格、缩进等设置文件的格式外, Code Cleanup 还应用了一组定义的代码样式约定。 如果项目有 EditorConfig 文件,将从中读取每个代码样式的首选项;如果没有,则从“选项”对话框中的代码样式设置读取。
调试正在运行的代码
现在,你已成功生成代码并执行了一点清理,按 F5 或选择 “调试>开始调试”来运行它。 此操作在调试环境中启动您的应用,以便可以详细观察应用程序的行为。 运行应用时 Visual Studio IDE 会更改: 输出 窗口由两个新窗口(在默认窗口配置中)、 “自动/局部变量/监视 ”选项卡式窗口和 “调用堆栈/断点/异常设置/输出 ”选项卡式窗口替换。 这些窗口有多个选项卡,可用于在应用运行时检查和评估应用的变量、线程、调用堆栈和其他行为。
通过按 Shift+F5 或单击 “停止 ”按钮来停止应用。 或者,你可以关闭应用的主窗口(或命令行对话框)。
如果代码完美且完全按预期运行,请恭喜! 但是,有时代码可能会停止响应或崩溃,或者提供一些奇怪的结果。 如果是这样,你应该试着找出这些问题的来源并修复漏洞。
设置简单的断点
断点 是可靠调试的最基本和最基本的功能。 断点指示 Visual Studio 应该在代码的哪个位置暂停,这样您就可以查看变量的值、内存操作的情况,以及代码分支是否正在被执行。 设置和删除断点后,无需重新生成项目。
通过单击要发生断点的行的远边距来设置断点,或按 F9 在当前代码行上设置断点。 运行代码时,它会在执行此代码行的说明之前暂停(或 中断)。
断点的常见用途包括:
若要缩小崩溃或无响应程序的来源范围,将断点分散到你认为导致失败的方法调用的代码中和周围。 在调试器中运行代码时,请删除并重置断点,使它们越来越接近,直到找到有问题的代码行。 请参阅下一部分,了解如何在调试器中运行代码。
引入新代码时,在代码开头设置断点,并运行代码以确保其行为符合预期。
如果已实现复杂的行为,请为算法代码设置断点,以便在程序中断时检查变量和数据的值。
如果要编写 C 或C++代码,请使用断点停止代码,以便在调试与内存相关的故障时检查地址值(查找 NULL)和引用计数。
有关使用断点的详细信息,请参阅 Visual Studio 调试器中的“使用断点”。
在运行时检查代码
当正在运行的代码命中断点并暂停时,标记为黄色的代码行(当前语句)尚未执行。 此时,你可能想要执行当前语句,然后检查更改的值。 可以使用多个 步骤 命令在调试器中执行代码。 如果标记的代码是方法调用,可以通过按 F11 进入。 还可以按 F10跳过代码行。 有关如何单步执行代码的更多命令和详细信息,请参阅 使用调试器浏览代码。
在上图中,可以通过按 F10 或 F11 (由于此处没有方法调用,因此这两个命令具有相同的结果)来推进调试器一条语句。
当调试器暂停时,可以检查变量和调用堆栈以确定发生了什么。 这些值是否在您期望看到的范围内? 调用是否按正确的顺序进行?
将鼠标悬停在变量上以查看其当前值和引用。 如果看到一个你没想到的值,则可能在前面的代码部分或调用代码中有错误。 若要了解详细信息,请参阅 Visual Studio 调试器。
此外,Visual Studio 还显示 “诊断工具” 窗口,你可以在其中观察应用随时间推移的 CPU 和内存使用情况。 稍后在应用开发中,可以使用这些工具查找意外的 CPU 使用率或内存分配。 将其与 监视 窗口和断点一起使用,以确定导致意外过度使用或未释放的资源的原因。 有关详细信息,请参阅首次查看分析工具(C#、Visual Basic、C++、F#)。
运行单元测试
单元测试是针对代码 bug 的第一道防线,因为正确完成时,它们测试了单个“单元”代码,通常是单个函数,并且比完整程序更易于调试。 Visual Studio 为托管代码和本机代码安装Microsoft单元测试框架。 使用单元测试框架创建单元测试、运行它们并报告这些测试的结果。 更改时重新运行单元测试,以测试代码是否仍然正常工作。 使用 Visual Studio Enterprise 版本,可以在每次生成后自动运行测试。
若要开始,请阅读 使用 IntelliTest 为模糊测试生成单元测试。
若要详细了解 Visual Studio 中的单元测试以及如何帮助你创建更高质量的代码,请阅读 单元测试基础知识。