Visual Studio 调试系列9 调试器提示和技巧

  • 2019 年 10 月 4 日
  • 笔记

01 固定数据提示

如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看。 即使在重新启动后,固定的变量也能保持不动。 要固定数据提示,请在鼠标悬停其上时单击固定图标。 你可以固定多个变量。

02 编辑代码并继续调试 (C#,VB, C++)

在 Visual Studio 支持的大多数语言中,你都可以在调试会话的过程中编辑代码,然后继续调试。 要使用此功能,请先在调试器中暂停,用鼠标点击进入代码,进行编辑,然后按 F5、F10 或 F11 键继续调试。

有关功能使用和功能限制的详细信息,请参阅编辑并继续

03 调试难以再现的问题

如果在应用中重新实现特定状态很困难或很费时,可以考虑使用条件断点。 你可以使用条件断点并对其加以筛选,以免破坏应用代码,直到应用进入所需的状态(例如,变量正在存储错误数据的状态)。 你可以使用表达式、筛选器、命中次数等来设置条件。

创建条件断点

  1. 右键单击断点图标 (红色的球),然后选择条件。
  2. 在断点设置窗口中,键入一个表达式。
  1. 如果你对另一种类型的条件感兴趣,请在断点设置对话框中选择筛选器,而不是条件表达式,然后按照筛选器的提示操作。

04 配置要在调试器中显示的数据

有关C#,Visual Basic 和C++(C++仅 /CLI 代码),可以让调试程序要使用下列选项显示的信息DebuggerDisplay属性。 有关C++代码中,可以执行相同的 using Natvis 可视化

05 更改执行流

让调试器暂停在某行代码上,用鼠标抓住左侧的黄色箭头指针。 将黄色箭头指针移动到代码执行路径中的其他点上。 然后通过 F5 键或步骤命令继续运行应用。

通过更改执行流,你可以进行测试不同代码执行路径或重新运行代码等操作,而无需重启调试器。

06 跟踪范围外的对象 (C#、 Visual Basic)

通过调试器窗口(如监视窗口)可以轻松查看变量。 但是,如果变量超出了监视窗口的范围,你可能会注意到它变成了灰色。在某些应用场景中,如果变量超出范围,变量的值甚至可能会发生变化,因此你可能需要密切关注它(例如,变量可能会被当做垃圾回收掉)。你可以在监视窗口中为该变量创建一个对象 ID 来跟踪这个变量。

创建对象 ID

  1. 在要跟踪的变量附近设置一个断点。
  2. 启动调试器 (F5),并在断点处停止。
  3. 在局部变量窗口(调试 > 窗口 > 局部变量)中找到该变量,右键单击该变量,然后选择创建对象 ID。
  1. 应该会在“局部变量” $ 窗口中看到 $ 窗口中设置断点来中断调用函数返回到的指令或行处的执行。 此变量是对象 id。
  2. 右键单击对象 ID 变量,然后选择添加监视。

有关详细信息,请参阅创建的对象 ID

07 查看函数的返回值

要查看函数的返回值,请在逐步执行代码时,查看自动窗口中显示的函数。 要查看函数的返回值,请确保你关注的函数已执行完毕(如果函数的调用目前处于停止状态,请按一下 F10 键)。 如果该窗口已关闭,请通过调试 > 窗口 > 自动窗口打开自动窗口。

此外,还可以在即时窗口中输入函数来查看返回值。 (通过调试 > 窗口 > 即时打开该窗口。)

此外,还可以在监视和即时窗口中使用伪变量,如 $ReturnValue

08 检查可视化工具中的字符串

在使用字符串时,如果能看到完整的、带格式的字符串会很有帮助。 要查看纯文本、XML、HTML 或 JSON 字符串,请将鼠标悬停在包含字符串值的变量上,然后单击放大镜图标

字符串可视化工具可以帮你确定字符串的格式是否正确,具体取决于字符串的类型。 例如,如果值字段为空,表明可视化工具类型未识别出该字符串。 有关详细信息,请参阅字符串可视化工具对话框

对于几个其他类型如调试器窗口中显示的数据集和 DataTable 对象,还可以打开内置的可视化工具。

09 在已处理的异常处中断代码

调试器会在未经处理的异常处中断代码。 但是,已处理的异常(例如 try/catch 块内发生的异常)也可能会造成错误,可能需要进一步调查。 可以将调试器配置为在已处理的异常处中断代码,方法是配置异常设置对话框中的选项。 要打开这个对话框,请选择调试 > 窗口 > 异常设置。

通过异常设置对话框,你可以让调试器在特定异常处中断代码。 在下图中,调试器会在发生 System.NullReferenceException 时中断代码。 有关详细信息,请参阅管理异常

10 调试死锁和争用条件

如果需要调试的问题对于多线程应用程序很常见,在调试时查看线程的位置,通常会有所帮助。 可使用源中显示线程按钮轻松完成此操作。

在源代码中显示线程

  1. 调试时,单击源中显示线程按钮

中调试工具栏。

  1. 查看窗口左侧的滚动条。 在这一行,你可以看到线程标记图标

,类似于两根细线。线程标记指示线程在此位置停止。 注意,线程标记可能被断点不完全遮挡。

  1. 将指针悬停在线程标记上。 屏幕上将显示数据提示。 数据提示将告诉你每个已停止线程的名称和线程 ID。 你还可以查看中的线程的位置并行堆栈窗口

11 检查 web 服务和网络资源 (UWP) 的有效负载

在 UWP 应用中,你可以分析使用 Windows.Web.Http API执行的网络操作。 可以使用此工具来帮助调试 web 服务和网络资源。 若要使用该工具,请选择调试 > 性能探查器。 选择网络,然后选择启动。 在应用中,浏览使用 Windows.Web.Http 的应用场景,然后选择 停止收集 生成报表。

在摘要视图中选择一个操作,查看更多详细信息。

有关详细信息,请参阅网络使用情况

12 将调试器附加到您的应用程序

若要附加到正在运行的应用,调试器将加载为想要调试的应用的相同内部版本生成的符号 (.pdb) 文件。 在某些情况下,了解符号文件的一些知识非常有用。 你可在模块窗口中检查 Visual Studio 如何加载符号文件。

在调试时,通过选择调试 > 窗口 > 模块 打开模块窗口。 模块窗口可以告诉你,调试器将哪些模块视为用户代码或我的代码,以及符号加载模块的状态。 在大多数情况下,调试器会自动为用户代码查找符号文件,但如果你想要单步跟踪 (或调试).NET framework 代码、系统代码或第三方库代码,必须执行其他步骤获取正确的符号文件。

你可以直接在模块窗口中右键单击并选择加载符号来加载符号信息。

有时,应用开发人员发布的应用不包含匹配的符号文件 (为了减少占用的空间),但会为内部版本保留一份匹配的符号文件,用于以后调试发布版本。

了解如何调试器如何区分用户代码,请参阅仅我的代码。 若要了解有关符号文件的详细信息,请参阅在 Visual Studio 调试器中指定符号 (.pdb) 和源文件