Studio调节和测量试验之断点进级篇,Studio调节和测验之断点本事篇

不亮堂能还是不可能算是技术啦,写出来放到首页贻笑大方而已。

在上一篇小说Visual
Studio调节和测量试验之断点基础篇
里面介绍了哪些是断点,INT 是速龙连串CPU的多个命令,能够让程序发生三个抛锚只怕非常。程序中一经有停顿或然特别发生了以后,CPU会中断程序的推行,去八个名字为IDT的构件查找管理那些中断(大概极其)的例程(Handler)。IDT是操作系统在起步的时候早先化的,至于IDT的内部意况难题,比方怎么着是IDT,怎么着编写二个IDT的例程,怎么样 起先化IDT,能够去网络查找一些素材。

函数断点

在前边的篇章Visual
Studio调节和测量检验之幸免单步追踪调节和测验格局
其间笔者讲了什么设置函数断点,说实话,作者个人爱好设置函数断点,并不是在代码行里面安装断点。一般的话,函数断点在上面几种状态下有用:

1.       举例调节和测验一个网址先后,你通过分析网址的日志开采最有希望发生错误的函数,打开调节和测验器并将调节和测量检验器附加到程序上去,设置函数断点,重新实施网址……那样做的裨益是,不用随地展开源文件去找寻错的源代码行,调节和测验器会自动张开源代码,并且在函数的入口处中断(岂不是很有益于?)。

 

2.       举个例子你在阅读源代码的时候,经常在读到虚函数调用的时候,因为一般来说这种调用都以由此基类指针调用的,而你又不常半会不知晓到底有哪些承接类的Overloading函数会被调用到,函数断点能够告知您。

 

3.       可能一种特殊的境况,你想读一个先后的源代码,但正是找不到入口Main函数,譬喻.NET程序,那么直接在Visual Studio里面按F11就能够帮您找到入口函数—那是函数断点的贰个特殊情状。

 

4.       比方您在调节和测验Web Service函数,设置函数断点也是四个急忙的调养方法,那一个本事跟技能1像样。

自然,大概有一点点读者未有章程成功安装函数断点,如果设置函数断点失利,请阅读笔者的篇章“没办法设置断点的反省手续”。借使中间有一部分名词术语(术语请参谋小说:调理术语)不掌握可能不领悟如何设置的话,呃,小编会另写一篇小说解说。

一句话来说,这里大家只要通晓,CPU在实行顺序指令进度中,遇到INT 3中断程序的施行,CPU然后去IDT表里面找各管理断点的例程入口。这么些例程要做的事情就是:

断点编制程序

有个别时候你或许会蒙受这种景况,触发一个断点今后,你发觉要求修改部分值,技术使程序继续科学实行下去。举个例子笔者曾在华语版本的操作系统上,使用sscli里面(调节和测量试验版)的csc.exe编译器编写翻译一些包蕴语法错误可能语法警告的C#源文件的时候,csc.exe总是会莫名其妙地告诉里面严重错误,然后就崩溃了。小编将调节和测验器附加上去然后,发掘是一个ASSERT错误,ASSERT(lcid == 0x409),表示sscli里面包车型客车csc.exe总是暗许本身在斯洛伐克共和国(The Slovak Republic)语操作系统(或许说德文碰到)里面运营。何况这一条语句会被试行很频仍,手工业修改lcid的值的确有一些麻烦。然后自身找源代码找来找去都未曾找到csc.exe在哪个地点得到到那个lcid值(当然笔者最后找到了,下一个本领将告诉您本人是怎么找到的),但是笔者又不想重启系统(呃……只怕笔者就是这种宁愿花1个小时去找节省开销5分钟重启系统的秘籍的那种人……)。

本条时候如若调节和测量检验器能够活动帮你重新初始化lcid的值该有多好?幸运的是,Visual
Studio提供了主意让您成功这么的职业。上边是一个简化的代码,因为本身不常半会找不到sscli了:

int lcid = System.Globalization.CultureInfo.CurrentUICulture.LCID;

Console.WriteLine("lcid = {0}", lcid);

 

地点的代码在健康景况下,应该回到当前操作系统语言的lcid值,举例土耳其(Turkey)语就是1033,中文的,呃……作者记不清了。假若大家现在愿意做的是,每当lcid的值为1033的时候,就机关考订为0。大家需求:

1.       在Console.WriteLine这一行上安装三个口径断点,条件断点的设置请参照他事他说加以考察Visual
Studio调节和测验之断点进级篇
图片 1

2.       点击Visual Studio菜单栏里面包车型地铁“工具(Tools)”—“宏(Macro)”—“宏财富处理器(Macro Explorer)”。然后创制五个新的宏:

Imports System

Imports EnvDTE

Imports EnvDTE80

Imports EnvDTE90

Imports System.Diagnostics

Imports Microsoft.VisualBasic

Imports Microsoft.VisualBasic.ControlChars

 

Public Module Module1

    Sub ChangeExpression()

        DTE.Debugger.ExecuteStatement("lcid = 0;")

    End Sub

End Module

 

地点DTE.Debugger.ExecuteStatement的机能,你可以知晓成在当时窗口中实行lcid
= 0;那条语句。

 

3.       右键点击刚才设置好的断点,在菜单里面选取“When
Hit …”,这贰回在“When
Breakpoint is Hit”窗口中勾选“Run a macro:(推行叁个宏)”,然后在下拉框里面选用刚刚您创设的宏的名称。借让你是率先次创制宏,名称应当是:Macros.MyMacros.Module1.ChangeExpression。

4.       勾选“继续实施(Continue
execution)”,因为我们并不想让程序中断下来。

5.       点击显著之后,推行顺序看一看结果,lcid是或不是早已被电动改成0了?图片 2

1.       先看看机器内部是否设置了一个调节和测量试验器—记住,这一步相当的重要,之所以主要未来的文章里面会介绍。

数码断点

留意,这些本事仅对C++程序调节和测验有效(也许说native程序),何况你只好在行车制动器踏板情势下技能设置数据断点,别的你还只好在本机设置数据断点。

上一节的例子里,咱们提到了,临时三个全局变量被涂改了之后,你也许都找不到它是如曾几何时候被改换的,于是夜已深,人已寐,你还在费劲地调节和测量试验到底是哪个鬼地方把那个变量的值修改了。F11, F10,……,SHIFT + F11,……,F5,靠,调过了,重来,F11,F10,……

这种景观下,数据断点就很有用了,Visual
Studio允许你在变量被涂改的时候,中断程序的举办,是不是很酷?

暗中同意情状下,你是找不到数码断点那么些菜单的,须要施行上边包车型大巴步子把它拉出去:

1.       张开你要调治的体系。

2.       点击Visual Studio菜单栏里面包车型客车“工具(Tools)”—“自定义(Customize…)”。然后在“自定义(Customize…)”窗口中甄选“命令(Commands)”页签里面包车型大巴“种类(Categories)”列表框里的“调节和测量试验(Debug)”,找到“新数据断点(New Data
Breakpoint)”,将它拖到菜单栏里面相应的地方。

然后展开或许创设叁个C++项目,我们以上边包车型大巴源代码为例子:

#include "stdafx.h"

 

int g_Variable = 0;

 

int _tmain(int argc, _TCHAR* argv[])

{

 

       printf("Before modifying data breakpoints"n");

 

       g_Variable = 1;

 

       printf("After modifying data breakpoints"n");

 

       return 0;

}

 

我们未来要Visual Studio在更换g_Variable的时候抛锚程序的试行。

1.       单击F11,那样程序就能够在_tmain函数里面中断了,我们也就有时机设置数据断点了。

2.       点击菜单里面包车型客车“新数据断点(New Data
Breakpoint)”。注意,数据断点是透过监视内部存款和储蓄器地址某一段区域更动来落到实处的,由此你必须提供叁个内部存款和储蓄器地址(或者说正是指针吧),这里g_Variable是三个整形变量,因而你供给运用“&g_Variable”的花样来成立一个数目断点,因为整形的
大小是4个字节,由此数据断点监视的区域是4个字节,如下图所示:
图片 3

3.       继续程序的施行,那时会弹出贰个对话框,告诉您有八个内部存款和储蓄器地址的剧情产生了扭转(表达大家的多寡断点生效了),这一世码行指向的是数据被修改的下一行代码,为啥会是下一行代码,下一篇小说会讲到:图片 4

呃,为啥数据断点只好在C++/C程序中本事安装?是因为托管代码有垃圾堆回收。而数据断点的实行原理应该是Windows内部存款和储蓄器处理内部的Guard Pages概念和VirtualProtectEx函数的贯彻。这么些概念能够自身去查MSDN的内部存款和储蓄器管理方面的文书档案。

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支持的种种断点,并表达种种断点的兑现形式

规格断点

第一大家先看看怎样设置标准断点,条件断点有二种,一种是依靠触发的次数来安装,别的一种是基于一条预置的尺度来设置。

依照触发次数设置

比如,你有七个生生不息,循环一千次,你明白有一个BUG总是在500次未来才会并发,因而一定希望在循环内设置贰个断点,然而前面500次都不会接触这几个断点,不然三番五次按500次的F5的确不是一件轻巧的差事。
图片 5

基于预置条件来安装

假若您曾经驾驭有些法则大概会掀起Bug,那么依照标准来设置则最合适可是了。如下图所示:
图片 6

在“断点条件(Breakpoint
Condition)”对话框里面,只必要输入一条健康的C#、C++只怕VB.NET的讲话就足以了(当然,语法是依赖你项目里面包车型地铁源代码语法一致),那条语句的渴求是必须回到bool值—不然就不是多少个条件了。

其八个还也会有断点过滤器,当你在断点上,右键点击弹出的菜单里面,会有二个“过滤(Filter)”菜单,它同意你限制将断点仅设置在特定的线程上。这里笔者就不细讲了,风趣味的话,能够团结写一个二十四线程或然多进程程序试试那个效果。

知情断点的法规现在,了解条件断点应该就不会是主题素材了。

监视断点(Watching Point)

有的时候,你可能需求查阅程序内部一些变量的值,可是你又不期望暂停程序的实行。举个例子你在调度一个网络协议栈,二个先后或者在收受数据包,你想看看数据包的格式,但如果中断程序的进行,会导致持续的数量包不见。

于是,大家一般的做法就是在源代码里面加一些日记记录代码,那样能够将部分变量的值记录下来,以便后续深入分析。要是日志在成品宣布之后还须求的话,在源代码里面插手这么些日记代码即就是叁个好主意,但是若是您只是想有时看看一些变量的值吗?

其有的时候候,监视断点就很有用了,Visual
Studio的监视断点就能够令你成功在不改变程序源代码的前提下,在调节和测量试验器窗口中打字与印刷一些变量的值。

下图演示了蹲点断点的用法:
图片 7

设置监视断点的步调,恐怕说是注意事项吧:

1.       设置一个平凡的断点

2.       右键单击刚刚安装的断点,在弹出美食做法里面选择“When
Hit…”

3.       钩选 第4个“打字与印刷一条音信(Print a
message)”复选框,输入一串文本,暗中认可景况下,你输入的文本会被直接打字与印刷到调节和测验的输出窗口里面来。除了:

a.       以$符号先导的多少个十分重要字。比方$FUNCTION就可以被替换来断点所在的函数名。别的有点第一字在“When
Breakpoints Is Hit”窗口个中有详细的验证。

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

那上边正是监视断点的效用,注意,你不得不在Visual
Studio的“输出(Output)”窗口中查阅结果。
图片 8

监视断点相对于日志记录的实惠是,你不必要改动源代码,并且重新编写翻译代码。实际上Visual
Studio实现监视断点的原理也极粗略,就是插入一个无独有偶的断点,断点触发之后管理况且打字与印刷在“When
Breakpoints Is Hit”窗口输出的表明式,最终自动复苏程序的施行。