C++Visual Studio调试的断点技巧篇

切莫晓能不能够算是技巧啦,写出来放到首页贻笑大方而已。

函数断点

于前头的稿子Visual
Studio调试的避免单步跟踪调试模式
其中我讲话了怎么设置函数断点,说实话,我个人爱好设置函数断点,而未是于代码行里面安装断点。一般的话,函数断点在脚几乎栽情况下发生因此:

1.       例如调试一个网站先后,你通过分析网站的日志发现最有或发生误的函数,打开调试器并将调试器附加到程序上,设置函数断点,重新履行网站……这样做的补益是,不用到处打开源文件去寻找出错的源代码行,调试器会活动打开源代码,并且以函数的入口处中断(岂不是大方便?)。

 

2.       例如你当翻阅源代码的时光,通常以朗诵到虚函数调用的时,因为一般这种调用都是经基类指针调用的,而而还要一时半会不知晓到底出哪个继承类的Overloading函数会吃调用到,函数断点可以告知您。

 

3.       或者同一种非常之状况,你想读一个程序的源代码,但纵然是找不顶入口Main函数,例如.NET程序,那么直接以Visual Studio里面照F11就能帮忙你找到入口函数—这是函数断点的一个特别情况。

 

4.       比如你当调节Web Service函数,设置函数断点也是一个速的调节方法,这个技术与技巧1好像。

本来,可能略读者没有主意成功安装函数断点,如果设置函数断点失败,请看我之章“未克设置断点的自我批评手续”。如果中间有部分名词术语(术语请参考文章:调节术语)不亮堂或者无掌握怎样设置的话,呃,我会另写一篇稿子讲解。

断点编程

一部分上你恐怕会见遇上这种气象,触发一个断点以后,你意识得改部分价值,才能够如程序继续是执行下。例如我原先以中文版本的操作系统及,使用sscli里面(调试版)的csc.exe编译器编译一些包含语法错误或者语法警告的C#根源文件的下,csc.exe总是会莫名其妙地告知中严重错误,然后便夭折了。我将调试器附加上然后,发现凡是一个ASSERT错误,ASSERT(lcid == 0x409),表示sscli里面的csc.exe总是默认自己当英文操作系统(或者说英文环境)里面运行。而且这同一漫漫告句会吃执行好频繁,手工修改lcid的价值的确有点累。然后自己找源代码找来找去都无找到csc.exe在谁地方获得到这个lcid值(当然我最终找到了,下一个术将晓你自我是怎么找到的),然而我而休思量更开系统(呃……也许我哪怕是那种宁愿花1独小时去探寻省花费5分钟还开系统的法的那种人……)。

本条时段如果调试器可以自动帮助你重置lcid的价该来差不多好?幸运的凡,Visual
Studio提供了办法被您就如此的劳作。下面是一个简化的代码,因为自身一时半会找不至sscli了:

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

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

 

地方的代码在健康状况下,应该归时操作系统语言的lcid值,例如英文就是1033,中文的,呃……我忘掉了。假设我们本期待做的凡,每当lcid的价值吗1033的上,就自动更正为0。我们需要:

1.       在Console.WriteLine这同实行及设置一个规范断点,条件断点的设置请参见Visual
Studio调试之切点进阶篇
C++ 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了?C++ 2

数断点

专注,这个技术但针对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只字节,如下图所示:
C++ 3

3.       继续次的履行,这时会弹来一个对话框,告诉您来一个内存地址的内容发生了变更(说明我们的数目断点生效了),这一时码行指向的是数额给修改的生一行代码,为什么会是产一行代码,下同样首文章会讲话到:C++ 4

呃,为什么数据断点只能当C++/C程序中才会装?是为托管代码有破烂回收。而数据断点的履原理应该是Windows内存管理中的Guard Pages概念和VirtualProtectEx函数的落实。这个定义可以协调失去查MSDN的内存管理方面的文档。