C++调试与诊断

调试是软件开发的基石之一,它可以消耗开发人员一天中相当大的一部分时间。  visualstudio本机调试器为查找和修复应用程序中出现的问题提供了强大且功能丰富的体验,无论问题的类型或解决的难度如何。  事实上,visualstudio中有太多的调试特性和工具,对于新用户来说可能有点难以承受。  本博客旨在让您快速浏览VisualStudio本地调试程序,以及它如何在C++开发的所有领域中帮助您。

null

目录

断点和控制流

在visualstudio中构建应用程序后,只需按F5键即可启动调试器。  当您开始调试时,有几个命令可以帮助您导航应用程序中的断点,以便您可以控制程序的状态和调试器的当前上下文。  这些命令使您可以灵活地控制调试器的作用域以及要研究的代码行和函数。

  • 继续[F5]: 跑到下一个断点。
  • 跨过[F10]: 运行下一行代码,然后中断。
  • 进入[F11]: 单步执行在当前代码行上调用的函数。
  • 跳出[Shift+F11]: 跳出当前函数并在函数调用后的下一个可执行行中断。

当鼠标悬停在代码中的断点上时,您将看到两个图标出现。  右侧带有两个圆圈的图标允许您快速打开或关闭当前断点,而不会丢失这行代码中的断点标记:

breakpoint

左边的图标将启动断点选项列表。您可以在这里向断点添加条件或操作。

bpmenu

有时您只希望在满足某个条件时命中断点,例如x<=5为真,其中x是调试器作用域中的变量。 条件断点 可以在visualstudio中使用inline breakpoint settings窗口轻松地进行设置,它允许您直接在源代码查看器中方便地将条件断点添加到代码中,而不需要模式窗口。  请注意,条件断点包含一个“+”符号,表示至少有一个条件已添加到断点。

inlinebp

还有一套 断点操作 这可以在断点处执行,比如打印进程ID或调用堆栈。VisualStudio还将这些断点操作称为“跟踪点”。  “内联断点设置”窗口允许您设置各种断点操作,例如打印调用堆栈或PID。  请注意,当至少有一个操作指定给断点时,断点将显示为菱形。  在下面的示例中,我们向断点添加了一个条件和一个操作;这使得它看起来像一颗钻石,里面有一个“+”符号。

inlinebp2

函数断点(观察点) 将在调试器遇到指定函数时激活。  使用 调试 菜单并选择 新建断点 添加函数断点。

functionbp

数据断点 将在调试期间命中特定地址时停止调试器。  使用 调试 菜单并选择 新建断点 添加函数断点。

数据检查与可视化

在断点处停止时,调试器可以访问当前存储在内存中的变量名和值 . 有几个窗口允许您查看这些对象的内容。

  • 当地人 :locals窗口列出调试器作用域中当前的所有变量,通常包括当前函数中迄今为止进行的所有静态和动态分配。
  • 汽车: 此窗口提供内存中的变量列表,这些变量来自:
    • 设置断点的当前行。
      • 请注意,在下面的示例中,第79行尚未执行。该变量尚未初始化,并且“自动”窗口没有可显示的值。
  • 前3行代码。正如您在下面看到的,当我们在第79行的断点处时,会显示前面的三行,并且已经检测到等待执行的当前行,但是在这一行执行之前,该值还不可用。

code1

autos

  • 观察: 这些窗口允许您在调试应用程序时跟踪感兴趣的变量。仅当列出的变量在调试器的范围内时,值才可用。
  • 快速监视 设计用于查看可变内容,而无需将其存储在监视窗口中以供以后查看。因为对话框是模态的,所以它不是在整个调试会话中跟踪变量的最佳选择:对于这种情况,监视窗口更可取。

quickwatch

  • 内存窗口: 它们提供了更直接的系统内存视图,并且不限于调试器中当前显示的内容。它们提供按位计数排列值的功能,例如16、32和64。此窗口主要用于查看未格式化的原始内存内容。此处不支持查看自定义数据类型。

memorywindow

自定义内存视图

visualstudio提供了Natvis框架,它使您能够自定义非原始本机数据类型在变量窗口(local、Autos、Watches)中的显示方式。  我们为我们的库运送NATVIS可视化工具,包括Visual C++ STL、ATL和MFC。  创建自己的Natvis可视化工具也很容易,可以自定义变量内容在上述调试器窗口中的显示方式。

创建Natvis文件

您可以将natvis文件添加到项目或作为.exe项目的顶级解决方案项。  调试器使用项目/解决方案中的natvis文件。  我们在下面提供了一个内置模板 Visual C++—> 实用程序 用于创建.natvis文件的文件夹。

newnatvis

这将把可视化工具添加到您的项目中,以便通过源代码管理更容易地跟踪和存储。

solnexp

有关如何编写.natvis可视化工具的更多信息,请参阅 Natvis文档 .

调试时修改Natvis可视化工具

下面的动画演示了如何为 火山 类型将更改调试器显示 在可变窗口中。  对象的顶级显示字符串将更改为显示 本地名称 而不是 英语名称 .  请注意调试器如何立即获取对.natvis文件所做的更改,差异如所示 红色 文本。 natvisedit

诊断工具和性能分析

大多数分析工具都以一种与调试器本身分离的特殊模式运行。  在visualstudio中,我们添加了一组可以运行的性能和诊断工具 在期间 调试并提供对应用程序性能和状态的更多了解。您可以控制应用程序的流程以到达问题区域,然后在深入研究问题时激活更强大的工具。 您可以完全控制程序并决定要分析的信息,而不是等待问题发生,无论是函数在CPU上花费的时间,还是按类型查看每个分配的内存使用情况。应用程序的实时CPU和内存使用情况将显示在图表中,调试器事件将沿时间线显示。每个包含的诊断工具都有一个选项卡:CPU使用率和内存使用率。

dtwindow

CPU使用率

此工具允许您查看在CPU图表上选定的时间范围内调用的每个函数的CPU使用情况。  您必须通过单击此选项卡左侧的“CPU评测”按钮来启用这些工具,以便选择用于分析的时间范围。

cpuusage

内存使用

此工具使您能够使用内存探查器,必须使用 堆分析 按钮,以便可以捕获堆快照。  左侧的按钮拍摄快照,您可以通过单击快照表中的蓝色链接来查看每个快照的内容。

snapshotreel

这个 类型视图 显示从内存快照解析的类型,包括计数和总内存占用。  您可以导航到 实例视图 通过双击此视图中的线。

typesview

这个 实例视图 显示从内存快照解析的类型,包括计数和总内存占用。  您可以导航到 实例视图 通过双击此视图中的线。  可以使用类型名称左侧的后退箭头导航回“类型”视图。

instancesview

这个 堆栈视图 显示程序的调用堆栈,并允许您浏览每个捕获的分配的调用路径。  您可以导航到 堆栈视图 通过选择 堆栈视图 查看模式 下拉列表。  此页的顶部显示了完整的执行调用堆栈,可以按被调用者或调用者(按顺序或相反顺序)排序,并调用右上角的控件 聚合调用堆栈依据 .  下面的部分将列出调用堆栈中选定部分的所有分配。  展开这些分配将显示它们的分配调用堆栈。

stacksview

调试过程和设备

附加到进程

在Windows机器上运行的任何进程都可以使用visualstudio进行调试。  如果要查看变量类型,请确保已为要附加到的进程加载调试符号。

attach

远程调试

要远程调试到可以通过网络连接到的另一台计算机,请通过调试器下拉列表启用远程调试器。  这允许您调试到一台机器上,无论它离您有多远,只要您可以通过网络连接到它。  您还可以轻松调试在外部设备(如Surface tablet)上运行的应用程序。

debugselector

可以在调试器属性页中管理IP地址和连接详细信息,可以使用Alt+Enter或右键单击解决方案资源管理器中的项目进行访问。

debugpp

多线程调试

visualstudio提供了几个功能强大的窗口来帮助调试多线程应用程序。  这个 平行堆叠 窗口在调试多线程应用程序时非常有用。它 线程视图 显示应用程序中所有线程的调用堆栈信息。它允许您在线程和这些线程上的堆栈帧之间导航。在本机代码中 任务视图 显示的调用堆栈 任务组 , 并行算法 , 异步代理 ,和 轻量级任务 .

parallelstacks

还有一个 平行表 专门为跨不同线程跟踪变量而设计的窗口,将每个线程显示为一行,将每个监视(对象)显示为一列。  您还可以计算数据上的布尔表达式,并将数据导出到电子表格(.csv或Excel)以供进一步分析。

parallelthreads

编辑并继续

编辑并继续 允许您在调试会话期间编辑代码的某些部分,而无需重建,这可能会节省大量开发时间。  这在默认情况下是启用的,并且可以使用调试选项进行切换或自定义,可以通过 调试 菜单和选择 选项 .

enc

其他资源

如果您对有关Visual Studio中调试的更多内容和视频感兴趣,请查看以下链接:

博客帖子

相关文件

视频

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享