VisualStudio中C++调试技巧和技巧

当我们编写软件时,我们的目标是第一次创建正确运行的应用程序。不幸的是,它很少以这种方式工作,我们花费大量的时间和精力调试代码中的问题,而不是添加新的值。幸运的是,当出现需要调查的问题时,visualstudio会提供世界级的调试经验,以帮助快速找到问题。然而,我们中的许多人并没有充分利用调试器,因为我们不知道或者只是忘记了它提供的许多加速问题解决的功能。

null

在这篇文章中,我将简要概述我在最近的一篇文章中展示的调试特性 C++调试技巧和技巧视频 . 它当然不能涵盖所有的功能,但每个功能都是 链接到更详细的信息,如果你想深入。此外,每个提示都包含一个直接链接,指向我在视频中显示的确切点。

因此,请仔细阅读下面的22个技巧,让我们知道其中有多少对您来说是新的-有人知道所有这些吗?你最喜欢哪一个?

最后,在继续之前,请花一分钟时间 注册以帮助我们继续改进调试器以更好地满足您的需要 .

提示和技巧

从项目属性配置启动选项 ( 1:25 ). 在开发软件时,一种常见的模式是添加配置选项,以根据命令行或环境变量设置更改行为或测试替代设计。您可以在项目属性页的“调试”选项卡上为目标应用程序配置命令行参数和设置环境变量(在解决方案资源管理器中右键单击项目,然后从上下文菜单中选择“属性”)。

函数返回值 ( 2:34 ). 在调试器中单步执行代码时,“自动”窗口将显示前一行代码中调用的所有函数返回的值。

clip_image002

设置下一语句 ( 3:16 )使您能够更改应用程序中将要执行的下一条指令。这对于返回并重新运行刚刚执行的部分非常有用,或者对于强制应用程序沿着不同的代码路径测试功能(例如,即使条件的计算结果为false,您也可以将执行移到条件块内部)非常有用。您可以通过单击并将左边距中的黄色指令指针拖动到所需行来更改下一条语句,通过右键单击所需行并从上下文菜单中选择“设置下一条语句”来通过上下文菜单访问它,或者使用键盘快捷键Ctrl+Shift+F10设置光标所在行的下一条语句。需要注意的是,这只会更改将要执行的下一条指令,不会撤消以前发生的任何操作,也不会运行代码如果您将其向前移动,例如,如果您跳过使用set next语句初始化变量的代码行,则应用程序将崩溃,因为变量将保持初始化状态。

进入特定阶段 ( 4:07 )允许您在同一行上有多个函数调用时直接单步执行函数,而无需导航到定义、设置断点,然后继续执行以命中断点。“单步执行”可以通过右键单击当前行或使用键盘快捷键Shift+Alt+F11从编辑器的上下文菜单访问

运行到光标 ( 5:05 )将调试器运行到该行,然后在该点停止,以此作为一次性使用断点。运行到光标可以从编辑器上下文菜单访问,也可以使用键盘快捷键Ctrl+F10运行到光标所在的行。运行到光标的另一个有用提示是,即使在设计时(不调试时),键盘快捷键Ctrl+F10也会开始调试,并将应用程序运行到该代码行,就像设置断点并按F5一样。

编辑并继续 ( 6:57 )在调试代码时是一个非常高效的省时工具。如果您注意到一个简单的错误,您可以在调试器中停止时更正它,而无需停止调试、重新编译并将应用程序运行回该位置。在VisualStudio 2015中,我们添加了对编辑的支持,并继续进入默认的C++调试引擎,包括支持X64调试。

异常设置 ( 8:31 )将调试器配置为在抛出指定的异常时停止,即使这些异常稍后会在应用程序中被捕获。这在调试应用程序正在处理异常但需要调试异常发生原因的问题时非常有用。

条件断点、命中计数断点和筛选器断点 ( 13:44 ). 条件表达式告诉调试器仅在满足应用程序中的某个条件时停止(例如,当变量与某个字符串匹配时)。命中计数使您能够根据断点被命中的次数进行中断,当该次数等于或大于绝对数时,或者当该次数是该数字的倍数时;如果您需要采取基于抽样的方法来解决问题(例如,仅显示每100次),这一点非常有用 值)。过滤条件是为并行处理场景设计的,允许您在特定线程、进程或计算机上执行时停止。

clip_image004

固定数据提示 ( 19:17 )在迭代代码路径(例如for循环)中工作时,您通常只关注一个值。通过在编辑器中将鼠标悬停在变量上来检查变量是很好的,但是当您移动鼠标时,数据提示就会消失。通过点击DataTip最右边的“pin图标”,您可以将其“粘贴”到编辑器中,使其在源代码行中保持可见,直到您选择关闭它。

clip_image006

并行堆栈窗口 ( 19:42 )在简明视图中显示进程中所有线程的调用堆栈。并行堆栈窗口通过Debug->Windows菜单打开。

clip_image008

显示外部代码 ( 20:30 ). visualstudio默认启用我们称之为 只是我的密码 通过将调用堆栈上的操作系统和运行时框架折叠到单个[External code]框架中,可以帮助您将注意力集中在所控制的代码上。如果您想要或需要查看完整的堆栈,可以在调用堆栈或并行堆栈窗口中单击鼠标右键以显示完整的调用堆栈。如果您喜欢在“始终关闭”的情况下进行调试,则可以在“调试”->“选项”下永久禁用“仅我的代码”

平行观察窗 ( 22:00 )显示当前函数中执行的所有线程的变量值。在递归方法的情况下,它还将跨堆栈帧显示相同变量的值。

clip_image010

冻结和解冻线程 ( 23:13 )为您提供对单个线程执行的细粒度控制。如果某个线程有问题,但在调试单个线程时不希望其他线程运行,则可以冻结不希望运行的线程。冻结时,即使您继续执行应用程序,它们也不会执行任何代码。

标记线程 将标记的线程运行到游标 ( 24:18 )标记线程使您能够创建线程组,然后就像Run-to-Cursor使您能够将应用程序运行到特定的代码行一样,Run-Flagged-threads-to-Cursor使您能够将一组线程移动到特定的代码行。这在需要控制某些线程位置的情况下非常有用(例如,确保没有线程持有锁,然后冻结它们)。

显示源中的线程 ( 26:13 )是一个设置,使您能够使用断点边距中的小图示符查看正在执行的线程。要打开它,请单击调试器工具栏上的“在源代码中显示线程”按钮(如下所示)。

clip_image012

当在并行运行的代码中工作时,这个特性是非常强大的,但是它的性能代价很小,所以当您不使用它时,不应该无限期地使用它。

clip_image014

调试位置工具栏 ( 28:09 )是一个工具栏,允许您访问当前调用堆栈,并能够在线程之间快速切换其他功能。如果您使用“常规设置”配置文件,它在默认情况下是可见的,否则您需要通过“视图”->“工具栏”手动启用它。

使用PageHeap调试堆损坏 ( 29:43 ). 堆损坏可能是最难解决的错误类型之一,因为导致损坏的逻辑错误通常发生在应用程序崩溃之前很久,或者行为异常导致很难诊断问题发生的位置。PageHeap是Windows中的一种功能,如果应用程序写入或读取不再拥有的内存,则操作系统会引发异常,从而导致堆损坏,从而导致调试器停止在导致堆损坏的位置。启用页堆当前需要使用 Windows调试工具 作为Windows SDK的一部分。安装Windows调试工具后,打开管理命令提示符并运行gflags/p/enable[executable name]以启用PageHeap,然后像正常一样在VisualStudio中调试应用程序。简单提醒一下,PageHeap会导致Windows执行更多的内存跟踪,因此它会减慢为其启用的应用程序的速度,因此如果不调试堆损坏,就不应该无限期地保持此状态。

clip_image016

性能提示 ( 33:32 )显示代码在调试器中的两个停止之间执行的时间(在单步执行代码时和在断点之间运行时)。

clip_image018

集成CPU配置文件 ( 35:53 )在编写代码时,我们通常会尽我们所能让它正常工作,并且很难或不可能花时间单独分析它。为了提高快速发现性能中主要问题的便利性,我们在调试器中集成了一个CPU探查器,可以通过 诊断工具窗口 .

集成内存配置 ( 38:01 )追踪内存泄漏可能很困难。为了使这一点尽可能简单,我们集成了内存分析工具,旨在帮助通过 诊断工具窗口 . 通过将其直接集成到调试器中,您可以对快照的拍摄位置进行细粒度控制,这意味着您可以查看由单个函数调用或一行代码引入的内存更改。

clip_image020

纳维斯 ( 41:03 )允许您自定义VisualStudio在调试器中显示本机类型的方式。在VisualStudio2015中,我们添加了对添加项目本地natvis文件的支持,这些文件在更新后立即在调试器中生效,无需重新启动调试。

显示导致访问冲突的源代码 ( 42:43 )通常,一行代码会遵从多个指针,这会导致查找触发访问冲突的确切指针。在Visual Studio 2015 Update 1中,我们将分析逻辑添加到调试器中,以向您显示触发访问冲突的确切源表达式。

clip_image022

结论

我希望这篇关于visualstudio调试器的简要概述对您有所帮助。如果您在下面的评论部分有任何评论或问题,请告诉我,或者 通过Twitter . 最后,我们一直在寻找 帮助我们改进visualstudio调试器 .

© 版权声明
THE END
喜欢就支持一下吧,技术咨询可以联系QQ407933975
点赞0 分享