常见问题解答 - 调试程序功能查找器

本文档解决了有关在 Visual Studio 中调试功能的常见问题。 它还将调试任务或问题映射到 Visual Studio 调试程序中的相关功能。 这些链接涵盖调试多线程应用程序、代码导航、内存泄漏、检查变量、使用断点、外部代码调试等任务或问题。 如果需要大致了解调试器功能,请改为参阅初探调试器

断点

  • 如何暂停代码运行以检查可能包含 bug 的代码行?

    设置断点。 有关详细信息,请参阅使用断点

  • 变量是否出现意外值? 或者,是否要在应用达到特定状态时对其进行检查?

    尝试设置条件断点以通过使用条件逻辑来控制断点的激活位置和激活时间。 右键单击断点以添加条件。 当变量等于意外值时,将条件设置为 True。

    有关详细信息,请参阅断点条件

  • 如何在可配置的条件下将信息记录到“输出”窗口,而无需修改或停止运行代码?

    借助跟踪点,你可以在可配置的条件下将信息记录到“输出”窗口,而无需修改或停止运行代码。

  • 如何知道变量的值何时更改?

    对于 C++,请设置数据断点

    对于使用 .NET Core 3 的应用,还可以设置数据断点

    此外,还可以使用条件断点跟踪对象 ID,但仅适用于 C# 和 F#。

  • 如何仅在命中另一个断点时中断执行?

    将依赖断点设置为仅当第一个命中另一个断点时,该断点才会中断执行。 有关详细信息,请参阅依赖断点

  • 能否只命中一次断点?

    设置一个临时断点,使你只能中断代码一次。 有关详细信息,请参阅临时断点

  • 能否在循环内的某个迭代位置暂停代码?

    将依赖断点设置为仅当第一个命中另一个断点时,该断点才会中断执行。 有关详细信息,请参阅命中次数

  • 如何在知道函数名称但不知道其位置时在函数开头暂停代码?

    你可以使用函数断点实现此操作。 有关详细信息,请参阅设置函数断点

  • 如何在同名的多个函数的开头暂停代码?

    如果有多个同名的函数(重载的函数或不同项目中的多个函数),则可以使用函数断点

  • 管理和跟踪断点

    使用“断点”窗口 。 有关详细信息,请参阅管理断点

  • 引发特定的已处理或未处理异常时暂停代码和调试

    尽管异常器向你显示了发生错误的位置,但如果想要暂停和调试特定的错误,则可以告知调试器在引发异常时中断

  • 在“调用堆栈”窗口中设置断点

    如果希望暂停和调试代码,同时在“调用堆栈”窗口中检查执行流或查看函数,请参阅在“调用堆栈”窗口中设置断点

  • 在特定程序集指令处暂停代码

    你可以通过在“反汇编”窗口中设置断点来实现此操作。

导航代码

  • 如何了解在调试时逐行执行代码的命令?

    有关详细信息,请参阅使用调试器逐行执行代码

  • 能否将代码运行到特定行,同时跳过断点而不删除或禁用断点?

    对于这些方案,可以使用“强制运行到光标处”。 可以保留断点,调试程序将跳过断点,直到它到达光标处的代码行。 它还将跳过任何可能发生的最可能异常中断条件。 有关详细信息,请参阅使用调试器逐行执行代码

  • 如果代码行调用了不同的方法,能否单步执行特定方法?

    右键单击代码行以显示上下文菜单,该菜单允许你选择“单步执行特定方法”。 这将显示可以单步执行的所有方法的列表。 现在可以选择感兴趣的方法。

检查和可视化数据

  • 如何在运行应用时检查变量的值?

    按照数据提示将鼠标悬停在变量上,或在“自动和本地”窗口中检查变量

  • 能否观察特定变量的变化值?

    对变量设置监视。 有关详细信息,请参阅对变量设置监视

  • 如何查看对于调试程序窗口而言过长的字符串?

    字符串可视化工具显示对于数据提示或调试程序窗口而言过长的字符串。 它还可以帮助识别格式错误的字符串。
    Visual Studio 中内置的字符串可视化工具包括 Text、XML、HTML 和 JSON 选项。

  • 如何查看大型集合对象?

    使用 DataSet 可视化工具,可以查看 DataSet、DataTable、DataView 或 DataViewManager 的内容。 使用 IEnumerable 可视化工具可以查看数组、列表等对象。有关详细信息,请参阅表格可视化工具

调试已运行的应用

  • 如何调试在本地或远程计算机上运行的应用、同时调试多个进程、调试并非在 Visual Studio 中创建的应用或未从 Visual Studio 启动的任何应用?

    请参阅附加到正在运行的进程

  • 如何重复附加到同一应用程序?

    可以使用“重新附加到进程”(Shift+Alt+P) 轻松实现一键启动应用程序调试,而无需每次都通过“附加到进程”对话框。 请参阅重新附加到进程

调试多线程应用程序

  • 如何调试多线程应用程序? 或者,应用程序是否处于挂起状态?

    请参阅并行堆栈窗口进一步排查问题

  • 如何查看函数的调用顺序?

    请参阅如何查看调用堆栈

分析内存

  • 应用程序是否存在内存泄漏?

    拍摄快照,并使用内存工具打开它以进一步排查问题。 请参阅度量内存使用情况

  • 如何分析本机或托管应用程序的内存使用情况?

    通过实时调试、堆转储或性能探查器使用 Visual Studio 内存工具。
    请参阅选择内存分析工具

  • 如何在不附加调试程序的情况下分析本机或托管应用程序的内存使用情况? 使用已启用内存使用情况工具的 Visual Studio 性能探查器。
    请参阅分析内存使用情况

  • 能否比较两个时间点之间的内存使用情况?

    比较内存工具中的快照或使用差异功能比较两个堆转储。 请参阅分析内存使用情况

外部代码调试

  • 能否在调试时仅查看用户代码?

    “仅我的代码”是一项 Visual Studio 调试功能,可自动单步跳过系统、框架和其他非用户代码调用。 在“调用堆栈”窗口中,“仅我的代码”将这些调用折叠到 [External Code] 帧中 。 请参阅使用“仅我的代码”仅调试用户代码

  • 如何查看或调试程序正在执行的原始程序集指令?

    使用“调试”>“Windows”>“反汇编”中的反汇编窗口。 可以一次单步执行一个指令,甚至可以在单个程序集指令上设置断点。

  • 能否查看 .NET 库的源代码?

    从“调试”>“选项”>“符号”启用 Microsoft 符号服务器,以便下载 .NET 库的符号和源。 请参阅指定符号

  • 如何从特定或共享位置或服务器加载 PDB?

    从“调试”>“选项”>“符号”配置符号服务器。 请参阅指定符号

  • 如何永不加载某个特定的 PDB? 或者,如何始终加载某一个?

    在“调试”>“选项”>“符号”中配置“包括”和“排除”列表。
    请参阅指定符号

配置调试

  • 如何配置调试程序设置?

    要配置调试器选项和调试器项目设置,请参阅调试器设置和准备

  • 如何自定义调试程序中显示的信息?

    你可能希望在其他调试器窗口中将非对象类型信息显示为值。 对于 C#、Visual Basic、F# 和 C++/CLI 代码,请使用 DebuggerDisplay 属性。 对于更高级的选项,还可以通过创建自定义可视化工具来自定义 UI。 对于本机 C++,请使用 NatVis 框架

其他任务

  • 是否需要保存转储?

    调试期间在错误或断点处停止时,选择“调试”>“将转储另存为”。 请参阅转储文件

  • 如何分析转储文件?

    在 Visual Studio 中,通过选择“文件”>“打开”,打开转储。 若要开始调试,请选择“仅调试托管内存”、“仅调试本机内存”、“调试混合型内存”或“调试托管内存”。 请参阅转储文件

  • 能否在调试会话期间编辑代码?

    使用编辑并继续。 对于 XAML,请使用 XAML 热重载

  • 如何在远程计算机上调试?

    请参阅远程调试

  • 如何修复性能问题?

    请参阅初探分析工具

  • 如何修复异常?

    请参阅修复异常