`
cloudtech
  • 浏览: 4605774 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Visual Studio调试之断点进阶篇

 
阅读更多

在上一篇文章调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样 初始化IDT,可以去网上搜索一些资料。

总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是:

1.先看看机器里面是不是安装了一个调试器—记住,这一步很重要,之所以重要以后的文章里面会介绍。

2.如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。

3.否则操作系统启动调试器,并将调试器附到进程上。

4. 这样,我们才能在调试器里面检查程序内部变量的值。

前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说VisualStudio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的?

或者更具体一些,我们在源代码(文本文件)里面设置断点的,VisualStudio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者 C#代码都会对应好几行汇编指令。

因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、VB.NET还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。

因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式

条件断点

首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。

根据触发次数设置

比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

根据预置条件来设置

如果你已经知道一些条件可能会引发Bug,那么根据条件来设置则最合适不过了。如下图所示:


在“断点条件(Breakpoint Condition)”对话框里面,只需要输入一条正常的C#、C++或者VB.NET的语句就可以了(当然,语法是根据你项目里面的源代码语法一致),这条语句的要求是必须返回bool值—否则就不是一个条件了。

第三个还有断点过滤器,当你在断点上,右键点击弹出的菜单里面,会有一个“过滤(Filter)”菜单,它允许你限制将断点仅设置在特定的线程上。这里我就不细讲了,有兴趣的话,可以自己写一个多线程或者多进程程序试试这个功能。

知道断点的原理以后,理解条件断点应该就不会是问题了。

监视断点(Watching Point)

有的时候,你可能需要查看程序内部一些变量的值,但是你又不希望中断程序的执行。例如你在调试一个网络协议栈,一个程序可能在接收数据包,你想看看数据包的格式,但如果中断程序的执行,会导致后续的数据包丢失。

因此,我们一般的做法就是在源代码里面加一些日志记录代码,这样可以将一些变量的值记录下来,以便后续分析。如果日志在产品发布以后还需要的话,在源代码里面加入这些日志代码固然是一个好主意,但是如果你只是想临时看看一些变量的值呢?

这个时候,监视断点就很有用了,Visual Studio的监视断点就可以让你做到在不修改程序源代码的前提下,在调试器窗口中打印一些变量的值。

下图演示了监视断点的用法:


设置监视断点的步骤,或者说是注意事项吧:

1.设置一个普通的断点

2.右键单击刚刚设置的断点,在弹出菜单里面选择“When Hit…”

3.钩选 第一个“打印一条消息(Print a message)”复选框,输入一串文本,默认情况下,你输入的文本会被直接打印到调试的输出窗口里面来。除了:

a.以$符号开头的几个关键字。比如$FUNCTION就会被替换成断点所在的函数名。其他有一些关键字在“When Breakpoints Is Hit”窗口当中有详细的说明。

b. 使用大括号 {}包含起来的变量名,这样的字符串会被替换成变量的值。

这下面就是监视断点的效果,注意,你只能在Visual Studio的“输出(Output)”窗口中查看结果。


监视断点相对于日志记录的好处是,你不需要改动源代码,并且重新编译代码。实际上VisualStudio实现监视断点的原理也很简单,就是插入一个普通的断点,断点触发之后处理并且打印在“WhenBreakpoints Is Hit”窗口输出的表达式,最后自动恢复程序的执行



分享到:
评论

相关推荐

    如何在visual studio调试 .net 源码

    如何在visual studio调试 .net 源码

    Visual Studio 调试器.pdf

    visual studio 最全的开发调试文档,高级调试帮助你更好的开发和测试。在首次在 Visual Studio 中运行您的应用程序,您可能通过按绿色箭头按钮启动它 工具栏中 (或F5)。 默认情况 下调试值显示在左侧的下拉列表中。 ...

    Visual Studio 2010 完全卸载工具

    微软官方提供的Visual Studio 2010彻底卸载工具,本人已亲测。用它可以轻松彻底地删除Visual Studio 2010以及它诸多的依赖项,让你彻底从机器上删除Visual Studio 2010。支持Visual Studio 2010 各种版本。 微软官方...

    ida7.0的visual studio调试插件

    ida7.0的visual studio调试插件官方免费版,ida7.0的visual studio调试插件支持vs2012019支持调试ida7.0版本,支持python2.7x64

    visual studio调试技巧

    visual studio调试技巧

    可用 OzCode 4.0.0.1313 强大的 Visual studio 调试工具 VS 2017/2019 可用

    OzCode是一款非常实用的VS调试插件,该插件使用可将VS可视化的调试提升到了一个新的高度,旨在与Visual Studio调试器集成并扩展其功能。 它是一个可视化调试器,可帮助您找出复杂的表达式,钻取内部异常,轻松添加...

    VisualStudio调试引擎MIEngine.zip

    Visual Studio MI Debug Engine ("MIEngine") 提供一个开源的 Visual Studio 调试器扩展,支持 GDB Machine Interface (MI) 规范的调试器,比如: gdb,lldb 和 clrdbg。MIEngine 是 Visual Studio 的调试引擎,实现...

    VisualStudioCode的Java调试器

    Visual Studio Code的Java调试器

    VisualSVN for Visual Studio 2022插件

    Visual Studio 2022 visualSvn 插件 亲测可用 如果你下载慢,就可以来这边下载。官方的下载速度太慢,真的等的没有耐心 VisualSVN is a professional grade Subversion integration plug-in for Visual Studio. Key...

    Visual Studio经典C++入门教程

    VisualStudio 其实是微软开发的一套工具集,它由各种各样的工具组成,这就好像 Office 2007是由 Word 2007、Excel 2007、Access 2007 等等组成的一个道理。其中 Visual C++就是 VisualStudio 的一个重要的组成部分。...

    Visual Studio调试基础篇.docx

    本书主要详细介绍如何在VisualStudio 下进行代码的编写和调试,对在使用VISUAL STUDIO开发人员是不错的选择。基础篇

    Oracle Developer Tools for Visual Studio 2019

    Oracle Developer Tools for Visual Studio 2019( ODT for VS 2019 19.3.0.0.0 (12 MB)) Download ODT for VS 2019, extract and run the VSIX file to install Oracle Developer Tools for Visual Studio 2019 ...

    SonarLint for Visual Studio 2019

    因为这是一个离线的文件,需要安装到visual studio中,怎么操作呢? 也是有办法的,不能直接像普通的exe文件一样双击就可以安装,他需要利用visual studio环境下的vsixinstaller.exe可执行程序来安装。我们需要...

    Visual C++ Redistributable for Visual Studio 2015

    Visual C++ Redistributable for Visual Studio 2015 Visual C++ Redistributable for Visual Studio 2015

    visual studio net初学者教程

    visual studio net初学者教程visual studio net初学者教程

    WIN7 , Visual studio 2010 C#串例程 + 虚拟串口 + 串口调试工具

    WIN7 , Visual studio 2010 C#串例程 + 虚拟串口 + 串口调试工具

    [Visual Studio] Visual Studio 2013 高级编程 (英文版)

    [Wrox] Visual Studio 2013 高级编程 (英文版) [Wrox] Professional Visual Studio 2013 (E-Book) ☆ 图书概要:☆ Comprehensive guide to Visual Studio 2013 Visual Studio is your essential tool for ...

    visual studio 2005下OpenGL配置

    visual studio 2005下OpenGL配置 vs2005下OPENGL配置 visual studio 2005下OpenGL配置 vs2005下OPENGL配置 visual studio 2005下OpenGL配置 vs2005下OPENGL配置 visual studio 2005下OpenGL配置 vs2005下OPENGL配置 ...

    visual studio 调试指南

    visual studio 调试指南 Feature Tour of the Debugger Get Started with the Debugger Navigate Code with the Debugger Watch a Video on using the Debugger Learn about Remote Debugging 。。。

Global site tag (gtag.js) - Google Analytics