Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4513260
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: LINUX

2010-05-27 17:57:47

调用运行命令

命令

参数含义

说明

continue

 

令程序继续运行

step

 

单步步入

next

 

单步步过

finish

 

执行到当前函数代码直到函数返回

until

 

跳出循环,让程序一直执行,直到到达比发出until命令时所在源代码行号更大的位置

stdpi

 

指令级单步步入

nexti

 

指令级单步步出

print /f expr

要打印的表达式。其中f 可以是 x十六进制 d 十进制o八进制等等。

打印表达式的值,可指定打印格式

whatis

 

查看变量数据类型的简要说明

ptype

 

查看变量数据类型的详细说明

x/nfu addr

要查看的内存地址

查看指定内存地址处的数据,可指定模式、长度等

Info registers

 

查看CPU寄存器

 

补充:

     Step命令,如果step命令将要运行的源代码行上有函数调用,那么step命令将导致GDB进入到被调用函数的内部。通常把step称为步入命令。这也是与next命令的区别。

其它命令:

命令

参数含义

说明

display

 

设置自动显示列表,不带参数时显示列表中所有表达式

delete display dnums…..

自动显示列表的ID

删除自动显示列表

disable dislay dnums…..

自动显示列表的ID

禁用自动显示列表

enable display dnums…..

自动显示列表的ID

使用自动显示列表

info display

 

显示自动显示列表中的表达式

show convenience

 

显示快捷变量

macro expand expression

包含宏定义的表达式

将表达式宏展示

info macro macroname

宏定义的名字

查看宏定义的信息

generatre-core file

 

产生转储文件

backtrace

n 最内层的n个函数栈帧

-n 最外层n个函数栈帧

栈帧回溯

frame

栈帧号或者内存地址

选定栈帧,不带参数时显示栈帧简要信息

up

栈帧号

选定栈帧上移

down

栈帧号

选定栈帧下移

info frame

 

显示栈帧详细信息

info agrs

 

显示当前选定栈帧的函数参数

info locals

 

显示当前选定栈帧中的所有局部变量

set variable expr

赋值表达式

给变量赋值或者修改变量的值

print

赋值表达式

给变量赋值或者修改变量的值

jump

 

使程序从另外的地址开始执行

signal sig

信号值或者信号和名称

向被调试程序发送信号

call expr

包含函数调用的表达式

调用函数

print expr

包含函数调用的表达式

调用函数

list

函数名 行号 地址 偏移等

列出程序源码

set listsize count

 

设置 list默认显示的行数

disassemble

 

反汇编被调试程序

set disassembly-flavor instruction-set

 

设置反汇编格式

补充:

    自动显示列表,当需要频繁地检查一个表达式的值时,如想搞清楚某个变量的值是如何变化的,那么就应当考虑把它加到GDB的自动显示列表中。在GDB中,每次当被调试的程序因为断点,单步或者任何其他原因暂停执行时,GDB都将打印出自动显示列表中的表达式的值。

    快捷变量是一种无类型的量,当它没有保存任何值时为void,快捷变量以$开头。由于在程序运行过程中变量的值是随时变化的,因此,快捷变量最常用的用途就是用来保存变量在从前的某个时刻的值,为后面分析变量的变化情况等工作提供参考。

    这里解释一下什么是栈帧,函数是C语言基本的模块单位,每次当函数执行时,函数的相关信息都将保存到进程的栈空间中。与函数执行相关的信息包括函数调用在程序源文件中所对应的位置、函数的调用参数,以及函数的局部变量等。第一次当发生一个函数调用时,与变个函数有关的这些停下都将保存到栈空间中的一个数据块中。和一个函数就对应栈空间中的一个数据块,通常把这些用来保存函数调用相关信息的数据块称做栈帧(Stack frame),当程序因为断点暂停执行时,就可以通过相应的GDB命令查看栈帧中的这些信息。从而可以了解函数的执行情况,通常也把栈帧简称为帧。

    当被调试程序开始执行以后,GDB就会存在一个选定的栈帧,通常情况下这个栈帧也就是当前下在执行的函数的栈帧,也可以通过GDB命令来选定其他栈帧。当使用print命令查看局部变量时,就是在当前选定的栈帧中查找这个局部变量。

    当程序开始执行时,在栈空间中一开始只存在一个栈帧,这个栈帧就是main()函数,main()函数的这个栈帧也常常被称为初始栈帧或最外层栈帧。每次当一个新的函数被调用时,就会开成一个新的栈帧,而当一个被调用的函数返回后,就会从栈空间中去掉这个栈帧。

    当函数的调用层次比较多时,就会形成一个连续的栈帧,假设现在main()函数中调用了foo()函数,而foo()函数中也调用了bar()函数,那么程序在bar()中暂停时形成的栈帧如下图所示。

 

    通常把main()函数称为最内层的帧,bar()函数称为最外层的帧。Main()函数对应的栈帧号最大。可以通过-fomit-frame-pointer来决定是否启动,在可执行代码生成函数的栈帧地址指针。

阅读(19520) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~