Visual Studio 调试系列9 调试器提示和技巧
如果你在调试时,经常将鼠标悬停在数据提示上,就可能想固定变量的数据提示,方便自己随时查看。 即使在重新启动后,固定的变量也能保持不动。 要固定数据提示,请在鼠标悬停其上时单击固定图标。 你可以固定多个变量。
在 Visual Studio 支持的大多数语言中,你都可以在调试会话的过程中编辑代码,然后继续调试。 要使用此功能,请先在调试器中暂停,用鼠标点击进入代码,进行编辑,然后按 F5、F10 或 F11 键继续调试。
有关功能使用和功能限制的详细信息,请参阅编辑并继续。
如果在应用中重新实现特定状态很困难或很费时,可以考虑使用条件断点。 你可以使用条件断点并对其加以筛选,以免破坏应用代码,直到应用进入所需的状态(例如,变量正在存储错误数据的状态)。 你可以使用表达式、筛选器、命中次数等来设置条件。
创建条件断点
右键单击断点图标 (红色的球),然后选择条件。
在断点设置窗口中,键入一个表达式。
如果你对另一种类型的条件感兴趣,请在断点设置对话框中选择筛选器,而不是条件表达式,然后按照筛选器的提示操作。
有关C#,Visual Basic 和C++(C++仅 /CLI 代码),可以让调试程序要使用下列选项显示的信息DebuggerDisplay属性。 有关C++代码中,可以执行相同的 using Natvis 可视化。
让调试器暂停在某行代码上,用鼠标抓住左侧的黄色箭头指针。 将黄色箭头指针移动到代码执行路径中的其他点上。 然后通过 F5 键或步骤命令继续运行应用。
通过更改执行流,你可以进行测试不同代码执行路径或重新运行代码等操作,而无需重启调试器。
通过调试器窗口(如监视窗口)可以轻松查看变量。 但是,如果变量超出了监视窗口的范围,你可能会注意到它变成了灰色。在某些应用场景中,如果变量超出范围,变量的值甚至可能会发生变化,因此你可能需要密切关注它(例如,变量可能会被当做垃圾回收掉)。你可以在监视窗口中为该变量创建一个对象 ID 来跟踪这个变量。
创建对象 ID
在要跟踪的变量附近设置一个断点。
启动调试器 (F5),并在断点处停止。
在局部变量窗口(调试 > 窗口 > 局部变量)中找到该变量,右键单击该变量,然后选择创建对象 ID。
应该会在“局部变量” $ 窗口中看到 $ 窗口中设置断点来中断调用函数返回到的指令或行处的执行。 此变量是对象 id。
右键单击对象 ID 变量,然后选择添加监视。
有关详细信息,请参阅创建的对象 ID。
要查看函数的返回值,请在逐步执行代码时,查看自动窗口中显示的函数。 要查看函数的返回值,请确保你关注的函数已执行完毕(如果函数的调用目前处于停止状态,请按一下 F10 键)。 如果该窗口已关闭,请通过调试 > 窗口 > 自动窗口打开自动窗口。
此外,还可以在即时窗口中输入函数来查看返回值。 (通过调试 > 窗口 > 即时打开该窗口。)
此外,还可以在监视和即时窗口中使用伪变量,如 $ReturnValue
。
在使用字符串时,如果能看到完整的、带格式的字符串会很有帮助。 要查看纯文本、XML、HTML 或 JSON 字符串,请将鼠标悬停在包含字符串值的变量上,然后单击放大镜图标。
字符串可视化工具可以帮你确定字符串的格式是否正确,具体取决于字符串的类型。 例如,如果值字段为空,表明可视化工具类型未识别出该字符串。 有关详细信息,请参阅字符串可视化工具对话框。
对于几个其他类型如调试器窗口中显示的数据集和 DataTable 对象,还可以打开内置的可视化工具。
调试器会在未经处理的异常处中断代码。 但是,已处理的异常(例如 try/catch
块内发生的异常)也可能会造成错误,可能需要进一步调查。 可以将调试器配置为在已处理的异常处中断代码,方法是配置异常设置对话框中的选项。 要打开这个对话框,请选择调试 > 窗口 > 异常设置。
通过异常设置对话框,你可以让调试器在特定异常处中断代码。 在下图中,调试器会在发生 System.NullReferenceException
时中断代码。 有关详细信息,请参阅管理异常。
如果需要调试的问题对于多线程应用程序很常见,在调试时查看线程的位置,通常会有所帮助。 可使用源中显示线程按钮轻松完成此操作。

在源代码中显示线程
调试时,单击源中显示线程按钮
中调试工具栏。
查看窗口左侧的滚动条。 在这一行,你可以看到线程标记图标
,类似于两根细线。线程标记指示线程在此位置停止。
注意,线程标记可能被断点不完全遮挡。
将指针悬停在线程标记上。 屏幕上将显示数据提示。 数据提示将告诉你每个已停止线程的名称和线程 ID。
你还可以查看中的线程的位置并行堆栈窗口。
在 UWP 应用中,你可以分析使用 Windows.Web.Http
API执行的网络操作。 可以使用此工具来帮助调试 web 服务和网络资源。 若要使用该工具,请选择调试 > 性能探查器。 选择网络,然后选择启动。 在应用中,浏览使用 Windows.Web.Http
的应用场景,然后选择 停止收集 生成报表。
在摘要视图中选择一个操作,查看更多详细信息。
有关详细信息,请参阅网络使用情况。
若要附加到正在运行的应用,调试器将加载为想要调试的应用的相同内部版本生成的符号 (.pdb) 文件。 在某些情况下,了解符号文件的一些知识非常有用。 你可在模块窗口中检查 Visual Studio 如何加载符号文件。
在调试时,通过选择调试 > 窗口 > 模块 打开模块窗口。 模块窗口可以告诉你,调试器将哪些模块视为用户代码或我的代码,以及符号加载模块的状态。 在大多数情况下,调试器会自动为用户代码查找符号文件,但如果你想要单步跟踪 (或调试).NET framework 代码、系统代码或第三方库代码,必须执行其他步骤获取正确的符号文件。
你可以直接在模块窗口中右键单击并选择加载符号来加载符号信息。
有时,应用开发人员发布的应用不包含匹配的符号文件 (为了减少占用的空间),但会为内部版本保留一份匹配的符号文件,用于以后调试发布版本。
了解如何调试器如何区分用户代码,请参阅仅我的代码。 若要了解有关符号文件的详细信息,请参阅在 Visual Studio 调试器中指定符号 (.pdb) 和源文件。
Visual Studio 调试系列9 调试器提示和技巧的更多相关文章
- Visual studio 2017 中的Javascript智能提示与调试
1.智能提示 对于JS文件中的API,你若需要让那个JS文件中的方法能够在你写的那个JS文件中能够智能显示的话,直接把它拉进你的JS文件中就好了. 举个例子:你想 在你正在写的a.js文件中引用b.j ...
- 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- 2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- Visual Studio 2017 通过SSH 调试Linux 上.NET Core
Visual Studio 2017 通过SSH 调试Linux 上.NET Core 应用程序. 本文环境 开发环境:Win10 x64 Visual Studio 2017 部署环境:Ubuntu ...
- Visual Studio 2010无法启动调试
现象:Visual Studio 2010点击调试或者按F5.Visual Studio 2010没有什么反应,但又不报错. 而点击运行不调试(Ctrl+F5)却没有问题. 解决的方法:打开项目属性, ...
- Visual Studio 2012设置Jquery/Javascript智能提示
Visual Studio 2012设置Jquery/Javascript智能提示 在Visual Studio 2008 Visual Studio 2010中微软已经开始支持jquery/java ...
- Unity3D实践系列03,使用Visual Studio编写脚本与调试
在Unity3D中,只有把脚本赋予Scene中的GameObject,脚本才会得以执行. 添加Camera类型的GameObject. Unity3D默认使用"MonoDevelop&quo ...
- 【转】Visual Studio 非常实用的调试技巧
下面有从浅入深的6个问题,您可以尝试回答一下 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入 ...
- Visual Studio 那些隐藏的调试功能(转)
原文出处: 微软互联网开发支持 Visual Studio 是一个强大的调试工具,里面很多隐藏功能少有人问津,但是在特定场景可以节省你很多时间,本文主要介绍一些Visual Studio调试相关 ...
随机推荐
- MySQL for OPS 04:存储引擎
写在前面的话 在使用 Linux 的时候,可以经常听到有关文件系统 FS(File System)的东西,MySQL 也有属于自己类似的东西,那就是存储引擎.之前在创建数据表的时候,在 Create ...
- 02_python基础(面向对象编程)
面向对象编程: 把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance ...
- angular获取时间
获取24小时制的时间<h1> {{time}} </h1> <script> angular.module('app', []) .controller('ctrl ...
- maven 学习---Maven自动化部署
在项目开发中,通常是部署过程包含以下步骤 检入代码在建项目全部进入SVN或源代码库中,并标记它. 从SVN下载完整的源代码. 构建应用程序. 生成输出要么WAR或EAR文件存储到一个共同的网络位置. ...
- linux清屏
clear 这个命令将会刷新屏幕,本质上只是让终端显示页向后翻了一页,如果向上滚动屏幕还可以看到之前的操作信息 reset 这个命令将完全刷新终端屏幕,之前的终端输入操作信息将都会被清空,这样虽然比较 ...
- Jenkins连接Git仓库时候报错Permission denied, please try again.
一.连接GIT仓库报错 Failed to connect to repository : Command : stdout: stderr: Permission denied, please tr ...
- django项目中cxselect三级联动
下载cxselect插件放在static文件夹下 前端引入 <script src="/static/js/jQuery-1.8.2.min.js"></scri ...
- 笔记6:Django基础
Django-MVT (1)查看python版本号: python -m django --version (2) 创建Django项目 django-admin startproject mysit ...
- flask 基础2
一.装饰器的坑 在使用装饰器函数时候,当一个装饰器装饰多个函数的时候,会由于内存地址相同时发生报错,因为装饰的都是一个函数 所以就需要引入 import functools 重新定义每一个函数的名称 ...
- JS高阶---原型链
[大纲] [主体] 1.创建函数 注意:Object内置原生对象原来就有 2.添加实例方法 3.根据构造函数创建实例对象 原型链寻找 1.本身有在本身找 2.本身没有往摸着隐式原型链往里找 或者再上层 ...