艾伟_转载:Visual Studio调试之断点进阶篇-阿里云开发者社区

开发者社区> 狼人2007> 正文

艾伟_转载:Visual Studio调试之断点进阶篇

简介: 文章导航 Visual Studio调试之断点基础篇 Visual Studio调试之断点进阶篇 Visual Studio调试之断点技巧篇 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常。
+关注继续查看

文章导航

Visual Studio调试之断点基础篇

Visual Studio调试之断点进阶篇

Visual Studio调试之断点技巧篇

在上一篇文章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里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的?

或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。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)”窗口中查看结果。

 

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10089 0
钉钉群直播【Structured Steaming的进阶与实践 】
structured steaming因其低时延和提供的SQL API等特性被越来越多的企业所使用,作为实时计算的首选。 本次分享structured steaming的使用,包含spark 2.4 structured streaming的新特性,API原理和使用场景等的介绍。
1450 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13892 0
xcode反汇编调试iOS模拟器程序(四)自动断点应用之NSNotificationCenter
知道怎么查看后,先看看有什么实际应用,拿NSNotificationCenter来做实践吧。 首先在某个容易进入的地方加断点,并停在那,例如main函数。
911 0
艾伟_转载:Visual Studio调试之断点进阶篇
文章导航 Visual Studio调试之断点基础篇 Visual Studio调试之断点进阶篇 Visual Studio调试之断点技巧篇 在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常。
923 0
SAS进阶《深入解析SAS》之对多数据集的处理
SAS进阶《深入解析SAS》之对多数据集的处理 1. 数据集的纵向串接: 数据集的纵向串接指的是,将两个或者多个数据集首尾相连,形成一个新的数据集。 据集的横向合并: 数据集的横向合并,指的是将两个或者多个数据集根据某种原则横向合并起来,形成新的数据集。 2. 数据集的纵向串接两种方法:1)使用SAS DATA步的SET语句。2)使用SAS过程步的APPEND过程。
1268 0
设计师进阶必读的设计书都在这里了(上部)
设计是一条不断成长的路,永远别说你已经通透了这其中的奥妙,因为你要学的还有很多很多,也要有广阔的视野和丰富的知识面。今天把一些值得设计师进阶必读的书目分享给小伙伴们。
654 0
+关注
狼人2007
个人对技术的追求:代码少而精捍;思路清晰美观;可扩展好维护;技术驱动商业; 人生格言:只要你有信念,有追求,并且坚持,那你一定比随波逐流,行得远行得正...
3528
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载