联合体以及怎么样调出内存窗口,Studio高级调试技巧

联合体相关:

1.
设置软件断点,运营到目标地方运行调试器

导语

实际联合体那块儿基本上跟struct用法是相同的,只不过联合体那里公用一块内存。

措施①:使用汇编指令(注:x64 c++不援救嵌入汇编)

在你调试程序时,当程序被停住时,你可以行使print命令(简写命令为p),或是同义命令inspect来查看当前先后的周转数据。print命令的格式是:

为了创造演示其颇具内容,需求调用二个内存窗口。这么些在查找的时候依然费了一部分武术的。来享受一下。

_asm int 3

print

图片 1

主意②:编译器提供的点子

print /

那般直白实施根本看不到具体的推行进度。

__debugbreak();

是表达式,是您所调试的先后的语言的表明式(GDB可以调节种种编程语言),是出口的格式,比如,倘诺要把表明式按16进制的格式输出,那么就是/x。

然则怎么才能看出 他们共用一块内存呢?

方法③:使用windows API

 

//从目前窗口是不曾章程查看内存的,程序一定要跑起来~才能查看。然而 跑到贰分一怎么才能查看呢!?~所以在 vs二零零六及以上版本,调用内存窗口很大的前提就是,为您正在开展的次序设置断点:

DebugBreak();

一、表达式

如下图:

WerFault.exe进度(Windows Error
Reporting)弹出ConsoleTest.exe已告一段落工作:

print和众多GDB的吩咐一样,尚可二个表达式,GDB会依据如今的程序运转的数据来计量那个表明式,既然是表达式,那么就足以是日前程序运转中的const常量、变量、函数等内容。可惜的是GDB无法选拔你在先后中所定义的宏。

图片 2

图片 3

表明式的语法应该是日前所调试的言语的语法,由于C/C++是一种SUZUKI型的语言,所以,本文中的例子都以有关C/C++的。

下一场运营程序。

要想现身“调试程序”选项,需求将Windows
Error Reporting注册表消息设置成如下图所示(注:越发是红框的情节)

在表明式中,有三种GDB所支撑的操作符,它们可以用在其余一种语言中。

图片 4

图片 5

@

跻身当前界面。

图片 6

是贰个和数组有关的操作符。

摁下F11单步运转。

假使在注册表AeDebug的Debugger项配置了VSJitDebugger路径,且VSJitDebugger安装经常

::

图片 7

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug

HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug  // 注:64位系统上的32位程序使用该注册表项

点名多少个在文件只怕一个函数中的变量。

下一场发现无论是是在vs编译环境依然在 大家的小窗题里面,都看到了先后的下一步运营,以后打出来了联合体的七个地方。下一步应该是到内存窗口中进行查看了。

图片 8

{}

 

点击“调试程序”选项就会弹出Visual
Studio实时调试器对话框,选取相应的调试器后,点击“是”就能够运营调试器并暂停到软件断点地点了

表示三个针对内存地址的门类为type的二个对象。

在运维中:点开调试下拉菜单:

图片 9

 

图片 10

急需留意的是,软件断点也是一种越发,一旦被处理,就不会传来WerFault.exe进度上,那么那种方法也就失效了!

贰 、程序变量

接下来点击 -> 窗口-> 内存 -> 内存1(1)。

上边二种状态软件断点极度会被处理:

在GDB中,你可以随时查阅以下两种变量的值:

下一场就能来看左下角里面出来了大家想要的窗口:

① 被SEH十分捕获并处理

① 、全局变量(全部文件可知的)

图片 11

图片 12

② 、静态全局变量(当前文件可知的)

这么内存窗口就应运而生了。

② 被自定义的全局十三分函数处理

叁 、局地变量(当前Scope可见的)

因为大家的出口窗口连突显得是:

图片 13

假定你的有的变量和全局变量发生争持(即重名),一般景况下是一对变量会隐藏全局变量,约等于说,即使3个全局变量和二个函数中的局地变量同名时,若是当前为止点在函数中,用print彰显出的变量的值会是函数中的局地变量的值。假设那时您想查看全局变量的值时,你可以利用“::”操作符:

 

注:可以将上边两种景况中的EXCEPTION_EXECUTE_HANDLER修改为EXCEPTION_CONTINUE_SEA冠道CH来指明非凡未取得处理

file::variable

图片 14

2.
改动变量
(注:在悬停出来小面板、Locals窗口、Autos窗口、沃特ch窗口、或Quick
沃特ch窗口中开展改动;也足以在Immediate窗口中履行:bFlag=false)

function::variable

就此我们在 内存里面输入这些地方:

图片 15

可以透过那种样式指定你所想查看的变量,是哪位文件中的或是哪个函数中的。例如,查看文件f2.c中的全局变量x的值:

然后敲击回车。就能观看大家输出的结果:

3.
格式化变量

gdb) p ‘f2.c’::x

图片 16

图片 17

自然,“::”操作符会和C++中的爆发冲突,GDB能自动识别“::”是或不是C++的操作符,所以您不要顾虑在调试C++程序时会出现卓殊。

开端施行 union myUnion u;

图片 18

其余,须求小心的是,假设您的次第编译时打开了优化增选,那么在用GDB调试被优化过的顺序时,或许会生出一些变量不只怕访问,或是取值错误码的情事。那一个是很正规的,因为优化程序会删改你的次第,整理你程序的语句顺序,剔除一些华而不实的变量等,所以在GDB调试那种程序时,运营时的命令和你所编纂指令就有不雷同,也就会冒出你所想象不到的结果。对付那种状态时,须要在编译程序时关闭编译优化。一般的话,大致拥有的编译器都协理编译优化的开关,例如,GNU 的C/C++编译器GCC,你可以选拔“-gstabs”选项来缓解那些题材。关于编译器的参数,还请查看编译器的应用表达文档。

u得到了一块空间,首地址是 0x0034FABC,长度为几个字节。

注:d,i:有号子的十进制数
      u:无符号的十进制数
      o:无符号的八进制数
      x:十六进制数(字母小写)
      X:十六进制数(字母大写)

 

然后是 u.a = 0x1234

4.
改动内存
(注:在内存窗口中,将光标定位到要修改的地点,直接按0-9输入十六进制;要输入a-f则需经过右键菜单中的“艾德it
Value”举行输入)

三、数组

上边的内存突显得是:

图片 19

突发性,你需求查阅一段连接的内存空间的值。比如数组的一段,或是动态分配的多少的大小。你可以动用GDB的“@”操作符,“@”的右边是首先个内存的地址的值,“@”的右手则你你想查看内存的长度。例如,你的次序中有这么的讲话:

34 12 00 00

5.
格式化展现内存

int *array = (int *) malloc (len * sizeof(int));

然后 大家举办 u.b = 1l

图片 20 

于是,在GDB调试进程中,你可以以如下命令显示出这几个动态数组的取值:

内存呈现的是:

6.
装置下3个运维地方
(注:直接拖动浅蓝箭头到想要的运作地方)

p *array@len

01 12 00 00

图片 21

@的左侧是数组的首地址的值,约等于变量array所指向的内容,右边则是数额的尺寸,其保存在变量len中,其出口结果,大概是底下那一个样子的:

然后打印联合体所占内存大小:

示范中:传入的bFlag为true,代码开首运行到断点处(43行),然后重新把色情箭头拖回39行,此时bFlag的值为false,按F10会进入else分支

(gdb) p *array@len

4

注:(1)跳过中间全部指令。意味着:printf(“True\n”)及CTest的析构函数均不会被实践

$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20,22, 24, 26, 28, 30, 32, 34, 36,
38, 40}

接下来输出 他们各种子变量的地点,发现联合体中,他们共用一块地点,并且在同二个地点进行值的改动。

     
(2)当拖动箭头到三个新的函数中时,vs会将原来的函数从栈中弹出,将新函数压入栈顶;

倘若是静态数组的话,可以直接用print数组名,就足以浮现数组中具有数据的情节了。

 

           
 由于新函数与上层函数没有调用关系,输出类型的参数及再次来到值很有只怕写坏上层函数的栈数据

 

 

     
(3)该调试技巧为一种事后表现,应审慎运用,最好是只在函数内一些使用

④ 、输出格式

 

7.
编纂然后继续运行

诚如的话,GDB会根据变量的品种输出变量的值。但您也得以自定义GDB的出口的格式。例如,你想出口3个平头的十六进制,或是二进制来查阅那几个整型变量的中的位的情况。要做到这样,你可以动用GDB的数码显示格式:

 

图片 22

x 按十六进制格式突显变量。

 

(1)不可能在6肆个人代码上应用

d 按十进制格式突显变量。

 

(2)使用“Program Database for Edit &
Continue (/ZI)”生成pdb文件

u 按十六进制格式突显无符号整型。

 

(3)仅适用于函数内部改变(若要修改函数原型或充实新函数,只可以采取重启程序)

o 按八进制格式显示变量。

 

8.
变量的部分破例查看方法

t 按二进制格式展现变量。

图片 23

a 按十六进制格式呈现变量。

以$和@起头的伪变量:(注:$和@五个记号是千篇一律的,随便用哪些都可以)

c 按字符格式显示变量。

$err — 获取GetLastError()的重返值

f 按浮点数格式展现变量。

$err,hr — 获取GetLastError()的重返值并解释重回值的意义

(gdb) p i

@eax — 查看eax的值(64位为@rax)

$21 = 101

@esp+4 — 函数的第③个参数地址

(gdb) p/a i

$handles — 查看打开的句柄数

$22 = 0x65

$tid  — 当前线程id

(gdb) p/c i

$vframe  — 当前栈帧的ebp

$23 = 101 ‘e’

$clk  — 以时钟周期为单位呈现时间

(gdb) p/f i

$ReturnValue — 查看函数的重临值

$24 = 1.41531145e-43

Message,wm –以windows消息的宏形式突显如:Message为15时,突显为WM_PAINT(注:Message为unsigned
int类型)

(gdb) p/x i

hResult,hr –hResult为0x80070005时,显示为E_ACCESSDENIED(注:hResult为void*类型)

$25 = 0x65

pArray,10 –从pArray地址起突显延续十三个int类型的数目(注:pArray为int*类型)

(gdb) p/t i

(pArray+5),3 –从pArray[5]地方起彰显两次三番3个int类型的多少(注:pArray为int*类型)

$26 = 1100101

9.
得到简单类型的函数重回值

 

图片 24

5、查看内存

注1:不能为inline函数

你可以使用examine命令(简写是x)来查看内存地址中的值。x命令的语法如下所示:

注2:执行函数的下一条语句时,查看eax或伪变量ReturnValue的值

x/

10.
使用指针类型转换查看有些地点的变量

n、f、u是可选的参数。

图片 25

n 是多个正整数,表示突显内存的长短,相当于说从此时此刻地方向后显示多少个地方的情节。

注:有时候,即使对象仍旧存在,在调试符号越界后,watch窗口中的变量是被剥夺的,不可以再查看(也不可以创新)。

f 表示突显的格式,参见上边。就算地点所指的是字符串,那么格式可以是s,借使地十是命令地址,那么格式可以是i。

     
若知道对象的地点,则足以将地方转换为该对象类型的指针,放在watch窗中来三番五次考察它。

u 表示从近期地方现在呼吁的字节数,借使不指定的话,GDB私行认同是六个bytes。u参数可以用上边的字符来取代,b表示单字节,h表示双字节,w表示四字节,g表示风水节。当大家指定了字节长度后,GDB会从指内存定的内存地址开首,读写指定字节,并把其看成1个值取出来。

11.
Command窗口

代表一个内存地址。

通过命令来成功vs中的功用(不仅仅在调节情形时使用),此外其调节相关命令与windbg保持一致。

n/f/u多少个参数能够共同使用。例如:

? nLocal  //查看变量nLocal的值
?? nLocal //将nLocal添加到Quick Watch窗口中
? nLocal=100 //修改nLocal的值为100
? MySum(20,30) //调用全局函数MySum,并返回结果
k //打印当前线程堆栈
~ //查看线程情况
~*k  //打印出所有线程的堆栈信息
watch //打开watch窗口
memory2 //打开memory2窗口
g //继续执行,F5功能
q //结束调试

命令:x/3uh
0x54320 表示,从内存地址0x54320读取内容,h表示以双字节为三个单位,3意味着三个单位,u表示按十六进制呈现。

12.
内存断点

 

图片 26

六 、自动显示

(1)在84行断点停住后,查看&s.Age的地方为0x0042FCEC

您可以设置某个自动展现的变量,当程序停住时,或是在您单步跟踪时,这么些变量会自行突显。相关的GDB命令是display。

(2)点击”Debug”-“New Breakpoint”-“New Data
Breakpoint…”,在弹出的对话框Address填入:0x0042FCEC,长度为4即可

display/

(3)当运维到88行时,由于Scores数组越界引发了s.Age的内存修改,触发了内存断点

expr是一个表明式,fmt表示突显的格式,addr代表内存地址,当您用display设定好了3个或五个表明式后,只要您的次第被停下来,GDB会自动呈现你所设置的这么些表达式的值。

13.
尺度断点

格式i和s同样被display扶助,一个百般实惠的吩咐是:

图片 27

display/i $pc

断点表明:

$pc是GDB的环境变量,表示着命令的地点,/i则意味着输出格式为机械指令码,相当于汇编。于是当程序停下后,就会油不过生源代码和机具指令码相对应的处境,那是贰个很有趣的效益。

(1)设置断点条件:i>6;且被击中次数>=2时才断住程序,所以首先次断住时i=8

上面是局地和display相关的GDB命令:

(2)命中时,在Output窗口中打印当前函数名及线程ID(也足以打印相关变量的值,详见”When
Breakpoint Is Hit”面板上的表达);在Command窗口中打印出堆栈消息

undisplay

(3)若不想断住程序,可以把”When Breakpoint Is Hit”对话框中的”Continue
execution”勾选上

delete display

注1:对于字符串的尺度断点,不或者写如下条件pStr==”Hello”(pStr为char*项目),应该写成:pStr[0]==’H’
&& pStr[1]==’e’ && pStr[2]==’l’ && pStr[3]==’l’ && pStr[4]==’o’
&& pStr[5]==’\0′

删去自动彰显,dnums意为所设置好了的活动显式的号码。倘使要同时删除多少个,编号可以用空格分隔,若是要刨除1个范围内的编号,可以用减号表示(如:2-5)

     vs二〇一〇及以上版本中,条件断点中可选用字符串:strcmp(pStr,
“Hello”)==0

disable display

     援救的字符串函数有:strlen, wcslen, strnlen, wcsnlen, strcmp,
wcscmp, _stricmp, _wcsicmp, strncmp, wcsncmp, _strnicmp, _wcsnicmp,
strchr, wcschr, strstr, wcsstr.

enable display

注2:也可以创制和谐的宏,具体方法:”Tools”-“Macros”-“Macro
Explorer”,然后在下图:MyMacros-Module1上右键飞速菜单中选拔”New macro”,

disable和enalbe不删除自动突显的安装,而只是让其失效和死灰复燃。

   
 如ChangeExpression宏函数会在Output窗口的Debugger过滤器下打印出”Hello
World”,然后修改变量code的值为一千

info display

     编写本身的宏时,可以参见大气vs已有的宏(见:Samples节点下)

翻看display设置的自动显示的新闻。GDB会打出一张表格,向您告知当然调试中装置了多少个机关展现设置,其中囊括,设置的号码,表达式,是或不是enable。

图片 28

 

Public Module Module1
    Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True)
        Dim window As Window
        Dim outputWindow As OutputWindow
        Dim outputWindowPane As OutputWindowPane

        window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
        If show Then window.Visible = show
        outputWindow = window.Object
        Try
            outputWindowPane = outputWindow.OutputWindowPanes.Item(Name)
        Catch ex As Exception
            outputWindowPane = outputWindow.OutputWindowPanes.Add(Name)
        End Try
        outputWindowPane.Activate()
        Return outputWindowPane
    End Function


    Sub ChangeExpression()
        Dim bppane As EnvDTE.OutputWindowPane

        bppane = GetOutputWindowPane("Debugger")
        bppane.OutputString("Hello World")
        DTE.Debugger.ExecuteStatement("code = 1000;")
    End Sub
End Module

7、设置突显选项

 

GDB中有关显示的选项比较多,那里本身只例举一大半常用的选项。

注3:若是弹出以下框,表明vs没有开启macro权限(Tools — Options… —
Environment — Add-in/Macro Security中勾选“Allow macros to run”)

set print address

图片 29

set print address on

注4:二零一六.11月windows系统更新后,各类版本的vs的宏失效。

开辟地址输出,当程序呈现函数消息时,GDB会显出函数的参数地址。系统私行认同为打开的,如:

        详见:https://visualstudioextensions.vlasovstudio.com/2014/02/13/visual-studio-2010-macros-stop-working-after-february-2014-windows-update/

(gdb) f

        vs2005sp1补丁 
vs2008sp1补丁 
 vs2010sp1补丁

#0 set_quotes (lq=0x34c78″<<“, rq=0x34c88 “>>”)

 

at input.c:530

14.在windows API上打断点

530 if (lquote != def_lquote)

(1)例如:对SetWindowText打断点。首先当前程序字符集为未安装或多字节,则SetWindowTextA;为Unicode则为SetWindowTextW。下边以SetWindowTextA为例。

 

(2)调试运转程序断住后,打开Modules窗口可以见到有着曾经加载的模块,找到windows
API所在的模块,右击鼠标执行”Load Symbols From” – “Microsoft Symbol
Servers”下载并加载对应模块的pdb

set print address off

(3)新建3个Break At
Function断点,填入:{,,user32.dll}_SetWindowTextA@8。可以看到,VS里面的标记跟windbg相比多了一部分字符,其中‘_’表示stdcall类型,前面‘@8’表示全部参数的字节数的和。

关门函数的参数地址显示,如:

       有个别函数Symbol
Name与导出函数名可能不雷同,例如GetDC(HWND),其Symbol
Name为NtUserGetDC,最终断点应填入:{,,user32.dll}_NtUserGetDC@4

(gdb) set print addr off

       注:查找windows
API符号名可以采用windbg的x命令可能使用pdb解析工具(symView

(gdb) f

图片 30

#0 set_quotes (lq=”<<“,rq=”>>”) at input.c:530

也得以直接行使地方对windows
API打断点(那种方法不需求符号的支撑):如对GetDC打断点,可以用Dependency查看其在user32.dll中导出函数地址(Entry
Point列):0x000172CC

530 if (lquote != def_lquote)

图片 31

show print address

然后在Modules窗口中收获user32.dll模块伊始地址0x758六千0,最终对七个值相加后的相对地址处直接设置断点:{,,user32.dll}0x758572CC

查看当前地方彰显选项是否打开。

图片 32

set print array

15.
异常(
First-chance)时断住程序

set print array on

在调试程序时,Output窗口有时会现出“First-chance exception in
xxx.exe…”那样的音讯。
貌似的话,那是由于程序中发出了拾叁分,被调试器捕获而爆发的出口。
在调试器中运营程序时,要是程序暴发非凡,调试器会首先得到通报(即First-chance
exception)。
若程序尚未捕获该尤其,则在终止进度以前,操作系统会再一次通报调试器(即Second-chance
exception,Last-chance exception)。

打开数组突显,打开后当数组突显时,每一种元素占一行,如若不打开的话,每一种元素则以逗号分隔。这些选项暗中认同是关门的。与之相关的八个指令如下,小编就不再多说了。

(1)在”Debug”-“Exceptions…”,弹出如下对话框:点击Add按钮,新增二个int类型的C++
Exceptions非常,并勾选Thrown

set print array off

图片 33

show print array

(2)当int、int*、int&的可怜被catch到时,会断住程序进入调试意况(注:以上void类型对应:char*、void*的异常)

set print elements

图片 34

这么些选项重假诺安装数组的,尽管您的数组太大了,那么就可以指定一个来指定数量浮现的最大尺寸,当到达那些长度时,GDB就不再往下显得了。尽管设置为0,则表示不限制。

16.
单步调试自动跳过不必进入的函数
  (注:仅适用于Native c++)

show print elements

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\NativeDE\StepOver]
"1"="\\scope:CString.*\\:\\:.*=NoStepInto"

查看print elements的选项消息。

注1:要是是三拾拾贰位windows,删除上边路径中的Wow6432Node

set print null-stop

注2:不进来其余CString的措施(后边的1意味优先级,该值越大优先级越高)

若果打开了这么些选项,那么当显示字符串时,蒙受为止符则截至突显。那几个选项暗中认同为off。

++++++++++++++++++++++++++++++

set print pretty on

NoStepInto 不可进入匹配函数
StepInto   可进入匹配函数

假定打开printf pretty这么些选项,那么当GDB呈现结构体时会比较不错。如:

特种字符串:

$1 = {

\cid 代表八个C/C++标识符
\funct 代表三个C/C++函数名
\scope
代表1个函数的功力范围(命名空间+类名 如:ATL::CFoo::CBar::)
\anything 代表壹个字符串
\oper 代表三个C/C++操作符

next = 0x0,

正则表明式:

flags = {

\ 转义字符 如:要使用 “\” 本人,
则应该利用“\\”
\: 代表字符:
. 匹配任意字符
*
其左手的字符被匹配任意次(0次或频仍)。如:be*匹配“b”,“be”或“bee”
.* 匹配0个或三个字符

sweet = 1,

越来越多例子:

sour = 1

例1:不进来重载操作符函数:
10
\scope:operator\oper:=NoStepInto
例2:除了CComBSTCRUISERs的非操作符函数,不进来其余ATL::开端的函数:
20
ATL\:\:CComBSTR::\funct:=StepInto
10 ATL\:\:.*=NoStepInto
例3:除了全局模版函数外,不进去其余模板函数:
20 \scope:\funct:=StepInto
10 .*[\<\>].NoStepInto

},

++++++++++++++++++++++++++++++

meat = 0x54 “Pork”

17.
应用OutputDebugString举办日志调试

}

(1)调试情形时,会将日志输出到Debug过滤器的Output窗口中

set print pretty off

图片 35

关门printf pretty那几个选项,GDB突显结构体时会如下展现:

(2)非调试境况时,可拔取DbgView.exe来捕捉程序日志

$1 = {next = 0x0, flags = {sweet = 1, sour= 1}, meat = 0x54 “Pork”}

图片 36

show print pretty

18.
施用autoexp.dat自定义调试时变量的来得格式

查阅GDB是哪些映现结构体的。

文件所在地点:Microsoft Visual Studio
9.0\Common7\Packages\Debugger\autoexp.dat

 

在autoexp.dat中的[Visualizer]域可以对各连串型变量的显得格式举办配备,来优化变量在调节时显得,升高作用。

set print sevenbit-strings

注:在vs中要让autoexp.dat生效必要去掉”Tools”-“Options…”对话框中,

安装字符突显,是还是不是按“\nnn”的格式呈现,假诺打开,则字符串或字符数据按\nnn显示,如“65”。

     “Debugging”-“General”-“Show raw structure of objects in variables
windows”的勾选

show print sevenbit-strings

(1) STL之string、vector、map

查看字符展现开关是不是打开。

①本来突显结果:

set print union

图片 37

安装展现结构体时,是或不是显式其内的联合体数据。例如有以下数据结构:

②安顿了autoexp.dat的来得结果:

typedef enum {Tree, Bug} Species;

图片 38

typedef enum {Big_tree, Acorn, Seedling}Tree_forms;

–>对应的陈设内容如下:

typedef enum {Caterpillar, Cocoon,Butterfly}

;  std::string -- char
std::basic_string<char,*>{
    preview        ( #if(($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,s]) #else ( [$e._Bx._Ptr,s]))
    stringview    ( #if(($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,sb]) #else ( [$e._Bx._Ptr,sb]))
    children
    (
        #if(($e._Myres) < ($e._BUF_SIZE))
        (
            #([actual members]: [$e,!] , #array( expr: $e._Bx._Buf[$i], size: $e._Mysize))
        )
        #else
        (
            #([actual members]: [$e,!],  #array( expr: $e._Bx._Ptr[$i], size: $e._Mysize))
        )
    )
}
;------------------------------------------------------------------------------
;  std::vector
;------------------------------------------------------------------------------
std::vector<*>{
    children
    (
        #array
        (
            expr :        ($e._Myfirst)[$i],
            size :        $e._Mylast-$e._Myfirst
        )
    )
    preview
    (
        #(
            "[", $e._Mylast - $e._Myfirst , "](",
            #array
            (
                expr :    ($e._Myfirst)[$i],
                size :    $e._Mylast-$e._Myfirst
            ),
            ")"
        )
    )
}
;------------------------------------------------------------------------------
;  std::map
;------------------------------------------------------------------------------
std::map<*>{
    children
    (
        #tree
        (
            head : $e._Myhead->_Parent,
            skip : $e._Myhead,
            size : $e._Mysize,
            left : _Left,
            right : _Right
        ) : $e._Myval
    )
    preview
    (
        #(
            "[", $e._Mysize, "](",
            #tree
            (
                head : $e._Myhead->_Parent,
                skip : $e._Myhead,
                size : $e._Mysize,
                left : _Left,
                right : _Right
            ) : $e._Myval,
            ")"
        )
    )
}

Bug_forms;

 

struct thing {

(2) 自定义类MyArray

Species it;

①本来显示结果:

union {

图片 39

Tree_forms tree;

②安排了autoexp.dat的来得结果:

Bug_forms bug;

图片 40

} form;

–>对应的配备内容如下:

};

MyArray{
    preview
    (
        #(
            "[size is ", $c.m_nSize, "] m_pData is (",
            #array
            (
                expr: ($c.m_pData)[$i],
                size: $c.m_nSize
            ),
            ")..."
        )
    )
    stringview
    (
        #(
            "Hello MyArray!!!"
        )
    )
    children
    (
        #(  
            #array
            (
                expr: ($c.m_pData)[$i],
                size: $c.m_nSize
            )
        )
    )
}

struct thing foo = {Tree, {Acorn}};

注1:双引号中字符串不大概含有冒号,如:”[size
is “无法写成”size: “

当打开这几个开关时,执行 p foo 命令后,会如下展现:

注2:多少个门类应用 |
进行连接。如:MyArray|ArrayEx

$1 = {it = Tree, form = {tree = Acorn, bug= Cocoon}}

注3:preview、stringview及children。对于不须求的部分能够毫不定义,且多个部分没有先后顺序之分。

当关闭那一个开关时,执行 p foo 命令后,会如下呈现:

注4:格式的概念的最外层用大括号{},其中的种种部分行使小括号()。

$1 = {it = Tree, form = {…}}

注5:格式定义出错时,运维VS会弹出提醒窗口,对于格式配置错误的类型,在调节期间无法不荒谬展现。

show print union

注6:最外层的左手的大括号{必须紧挨着最后3个项目名,否则无论后边的格式正确与否,都没办法儿不奇怪显示。

查看联合体数据的突显方式

注7:符号;为行注释符。

set print object

注8:$c代表近来所定义数据结构的靶子,#array表示用数组形式显得内容,$i代表数组中的各种成分的目录,$e表示数组中的各种成分的值

在C++中,即便多少个对象指针指向其派生类,若是打开那一个选项,GDB会自动依据虚方法调用的平整展现输出,假若关闭那个选项的话,GDB就不管虚函数表了。这么些选项暗中同意是off。

注9:array结构必须同时包蕴expr和size七个部分,缺乏其中二个局部都将招致新闻无法正确显示。

show print object

注10:可使用#switch、#if举行规范分支判断,要留心的是:#switch结构无法用来#array结构中,否则大概导致VS挂死。

查阅对象接纳的设置。

set print static-members

本条选项表示,当突显1个C++对象中的内容是,是或不是出示中间的静态数据成员。暗中同意是on。

show print static-members

翻看静态数据成员选项设置。

set print vtbl

当此选项打开时,GDB将用相比规整的格式来突显虚函数表时。其暗许是关门的。

show print vtbl

翻看虚函数彰显格式的选项。

 

捌 、历史记录

当你用GDB的print查看程序运转时的数额时,你每三个print都会被GDB记录下来。GDB会以$1,
$2, $3
…..如此的点子为您每二个print命令编上号。于是,你可以动用那么些编号访问以前的表明式,如$1。那么些效用所牵动的好处是,假使您以前输入了1个相比较长的表明式,如若你还想查看这几个表明式的值,你能够运用历史记录来访问,省去了双重输入。

 

九 、GDB环境变量

您可以在GDB的调剂环境中定义本身的变量,用来保存一些调试程序中的运维数据。要定义三个GDB的变量很简单只需。使用GDB的set命令。GDB的环境变量和UNIX一样,也是以$起首。如:

set $foo = *object_ptr

行使环境变量时,GDB会在您首先次采取时成立这些变量,而在其后的选择中,则一向对其赋值。环境变量没有项目,你能够给环境变量定义任一的种类。包罗结构体和数组。

show convenience

该命令查看当前所设置的富有的环境变量。

那是三个相比较强硬的效能,环境变量和顺序变量的并行使用,将使得程序调试更为灵活轻便。例如:

set $i = 0

print bar[$i++]->contents

于是,当你就无须,print bar[0]->contents, print
bar[1]->contents地输入指令了。输入那样的下令后,只用敲回车,重复执行上一条语句,环境变量会活动抬高,从而做到每一种出口的效益。

 

十 、查看寄存器

要查阅寄存器的值,很简短,可以应用如下命令:

info registers

翻看寄存器的情事。(除了浮点寄存器)

info all-registers

翻开全体寄存器的状态。(包蕴浮点寄存器)

info registers

查阅所指定的寄存器的地方。

寄存器中放置了程序运营时的数据,比如程序当前运行的下令地址(ip),程序的当下堆栈地址(sp)等等。你同一可以使用print命令来访问寄存器的情事,只须要在寄存器名字前加二个$符号就可以了。如:p
$eip。 

相关文章