C#学习笔记——调试
官网:https://docs.microsoft.com/en-us/visualstudio/debugger/debugger-tips-and-tricks?view=vs-2019
了解Visual Studio中调试器的生产力提示和技巧
阅读本主题,以了解一些有关Visual Studio调试器的生产力提示和技巧。要了解调试器的基本功能,请参阅先了解调试器。在本主题中,我们涵盖了功能导览中未包括的一些区域。
引脚数据提示
如果在调试时经常将鼠标悬停在数据提示上,则可能需要将数据提示固定在变量上,以便快速访问。即使重新启动后,变量仍保持固定状态。要固定数据提示,请将鼠标悬停在其上方时,单击“固定”图标。您可以固定多个变量。
编辑代码并继续调试(C#,VB,C ++)
在Visual Studio支持的大多数语言中,您可以在调试会话的中间编辑代码,然后继续进行调试。要使用此功能,请在调试器中暂停时用光标单击代码,进行编辑,然后按F5,F10或F11继续调试。
有关使用功能和功能限制的更多信息,请参见“编辑并继续”。
编辑XAML代码并继续调试
要在调试会话期间修改XAML代码,请参阅使用XAML Hot Reload编写和调试运行的XAML代码。
调试难以重现的问题
如果在您的应用程序中重新创建特定状态很困难或很耗时,请考虑使用条件断点是否有帮助。您可以使用条件断点和过滤断点来避免闯入应用程序代码,直到应用程序进入所需的状态(例如,变量存储错误数据的状态)。您可以使用表达式,过滤器,命中数等设置条件。
创建条件断点
-
右键单击断点图标(红色球),然后选择条件。
-
在“断点设置”窗口中,键入一个表达式。
-
如果您对其他类型的条件感兴趣,请在“断点设置”对话框中选择“过滤器”而不是“条件表达式”,然后按照过滤器提示进行操作。
配置数据以显示在调试器中
对于C#,Visual Basic和C ++(仅C ++ / CLI代码),您可以使用DebuggerDisplay属性告诉调试器显示哪些信息。对于C ++代码,您可以使用Natvis可视化工具执行相同的操作。
更改执行流程
在调试器停在一行代码上的情况下,使用鼠标抓住左侧的黄色箭头指针。将黄色箭头指针移到代码执行路径中的其他点。然后,使用F5或step命令继续运行该应用程序。
通过更改执行流程,您可以执行诸如测试不同代码执行路径或重新运行代码之类的操作,而无需重新启动调试器。
警告
通常,您需要谨慎使用此功能,并且在工具提示中会看到警告。您可能还会看到其他警告。移动指针不能将您的应用恢复到较早的应用状态。
跟踪范围外的对象(C#,Visual Basic)
使用诸如“监视”窗口之类的调试器窗口可以轻松查看变量。但是,当变量在“监视”窗口中超出范围时,您可能会注意到它是灰色的。在某些应用程序场景中,即使变量超出范围,变量的值也可能会更改,您可能需要仔细观察(例如,变量可能会被垃圾回收)。您可以通过在“监视”窗口中为其创建对象ID来跟踪变量。
创建对象ID
-
在要跟踪的变量附近设置一个断点。
-
启动调试器(F5)并在断点处停止。
-
在“本地”窗口中找到变量(“调试”>“ Windows”>“本地”),右键单击该变量,然后选择“创建对象ID”。
-
您应该在“本地”窗口中看到一个$加上一个数字。此变量是对象ID。
-
右键单击对象ID变量,然后选择添加监视。
有关更多信息,请参见创建对象ID。
查看函数的返回值
要为您的功能,看看出现在该功能查看返回值的汽车窗口,而你是单步执行代码。要查看某个函数的返回值,请确保您感兴趣的函数已经执行(如果您当前在函数调用中停止,请按一次F10键)。如果窗口关闭,使用调试>窗口>汽车,打开汽车的窗口。
另外,您可以在立即窗口中输入函数以查看返回值。(使用调试> Windows>立即打开它。)
您还可以在“监视并立即”窗口中使用伪变量,例如。$ReturnValue
在可视化器中检查字符串
使用字符串时,查看整个格式化的字符串可能会有所帮助。要查看纯文本,XML,HTML或JSON字符串,将鼠标悬停在包含字符串值的变量上时,请单击放大镜图标。
字符串可视化工具可以帮助您找出字符串是否格式错误,具体取决于字符串类型。例如,空白的“值”字段表示可视化器类型无法识别该字符串。有关更多信息,请参见String Visualizer对话框。
对于出现在调试器窗口中的其他一些类型,例如DataSet和DataTable对象,您也可以打开内置的可视化器。
闯入处理异常的代码
调试器会在未处理的异常情况下闯入您的代码。但是,已处理的异常(例如,在try/catch
块中发生的异常)也可能是错误的来源,您可能想调查它们的发生时间。您还可以通过配置“异常设置”对话框中的选项,将调试器配置为闯入处理异常的代码。通过选择“调试”>“ Windows”>“异常设置”打开此对话框。
通过“异常设置”对话框,您可以告诉调试器针对特定异常闯入代码。在下图中,只要System.NullReferenceException
出现a,调试器就会侵入您的代码。有关更多信息,请参见管理异常。
调试死锁和竞争条件
如果您需要调试多线程应用程序常见的问题,则通常有助于在调试时查看线程的位置。您可以使用在源代码中显示线程按钮轻松完成此操作。
在源代码中显示线程
-
调试时,单击“调试”工具栏中的“在源中显示线程”按钮。
-
查看窗口左侧的装订线。在此行上,您看到一个类似于两个布料线程的线程标记图标 。线程标记指示线程在此位置停止。
请注意,断点可能会部分隐藏线程标记。
-
将指针悬停在线程标记上。出现数据提示。DataTip会告诉您每个已停止线程的名称和线程ID号。
您还可以在“并行堆栈”窗口中查看线程的位置。
更加熟悉调试器如何附加到您的应用程序(C#,C ++,Visual Basic,F#)
要附加到正在运行的应用程序,调试器将加载与要调试的应用程序完全相同的内部版本生成的符号(.pdb)文件。在某些情况下,对符号文件的一些了解可能会有所帮助。您可以使用“模块”窗口检查Visual Studio如何加载符号文件。
在调试时,通过选择“调试”>“ Windows”>“模块”,打开“模块”窗口。“模块”窗口可以告诉您调试器将哪些模块视为用户代码或“我的代码”,以及该模块的符号加载状态。在大多数情况下,调试器会自动查找用户代码的符号文件,但是如果您要进入(或调试).NET代码,系统代码或第三方库代码,则需要采取额外的步骤来获取正确的符号文件。
您可以通过右键单击并选择“加载符号”,直接从“模块”窗口中加载符号信息。
有时,应用程序开发人员在交付应用程序时没有匹配的符号文件(以减少占用空间),但保留了匹配的符号文件的副本以进行构建,以便他们以后可以调试发行的版本。
要了解调试器如何将代码分类为用户代码,请参见Just My Code。要查找有关符号文件的更多信息,请参见Visual Studio调试器中的指定符号(.pdb)和源文件。