支持HW团队,就支付宝领取下面的红包吧!(2018年3月31前,就几毛,也会几块,可以和其他红包叠加使用),你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

小伙伴们,给大家发红包喽!人人可领,领完就能用。祝大家领取的红包金额大大大!#吱口令#长按复制此消息,打开支付宝就能领取!er1OEj73Uj

登入 注册 | 验证
| 搜索

博主:初学MPEG

初学MPEG 本博客-采用Python的web框架Django与Mysql数据库,致力于对Python、Django的了解 与研究
Django技术QQ群:XXXXXXX
Python技术QQ群:XXXXXXX

分类

关键字

本站最新博文

友情链接  

[转]GDB命令使用总结(一)(二)

类别:其他 状态:游客可见,可回,会员可关联(良好) 阅读:5714 评论:0 时间:九月 4, 2014, 4:30 p.m.
关键字:

  来源:http://blog.chinaunix.net/uid-20788636-id-1841300.html

    在Linux编程应该都用过GDB调试器,它的功能很是强大,不过这里也只是总结了部分的功能。还有其它很多的功能需要在以后的学习中积累,现在现总结一下。

    在GCC中,-g选项可以生成的可执行程序中加入调试信息。调试信息保存在目标文件中,它描述的内容包括变量的数据类型,函数的原型声明,程序符号表,行号,与指令之间的对应关系,等等。-g完整形式是-glevel,其中,level中指定了调试信息中包括了调试信息的多少,默认的是21最少,level=3最多。

假设现在有一个程序文件,文件名为test.c,而且需要一个参数做为输入的话,

我们可以这样编译这个程序:

gcc –g –o test test.c

然后,要使用gdb进行调试时

gdb –args ./test 10

,也可以在启动GDB以后再把程序加载到GDB的调试环境中

(gdb) file test

 

要是指定参数的话可以这样 run 10,在命令run 后面加上参数

还有一种方法就是通过set args命令

set args 3
run

基本的命令:

   

   

       

help

 

打印GDB帮助信息

shell

 

GDB开发执行shell命令

Set language

 

设置工作语言

set history

 

设置GDB命令历史

file filename

程序的文件名

加载/filename并读取符号表

exec-file filename

程序的文件名

加载/filename但不读取符号表

run

如果有参数,则作为程序的入中参数传递给被调试的程序,支持I/O重定向

启动被调试程序的运行

set agrs

程序运行时的参数

为被调试程序指定运行参数

set environment name = value

环境变量的名称和值

设置程序运行时的环境变量

cd

要更改到的目录

设置被调试程序的当前工作目录

pwd

 

显示程序的当前工作目录

kill

 

停止被调试程序的运行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

补充:

       file exec-file的区别就在于,file命令除了会在内存中初始化程序的代码段,数据段,堆和栈后,还会将程序文件中的符号表信息也载入到GDB中,而exec-file命令不会载入符号表,只会加载可执行的二进制的映像,比如,使用exec-file test命令时,在设置断点时,break main 分出现下面的提示错误 No symbol table is loaded Use the “file” command.

在使用set命令时,还是可以设置环境变量,

set environment valuename = value

输入输出重写向

(gdb) run > error.log 2>&1

      > error.log表示把所有输出到标准输出上的信息都重定向到error.log文件中,而2>&1则表示将标准出错的文件描述符复制到标准输出的文件描述符上。无论程序的标准输出还是标准出错信息都将送入error.log文件中。

断点设置命令

  

   

  

break

断点位置

设置程序断点

tbreak

断点位置

设置临时断点,触发一次后自动删除

hbreak

断点位置

设置硬件断点,必须要有硬件的支持

thbreak

断点位置

设置临时硬件断点

rbreak

正则表达式

在与正则表达式匹配的函数入口上设置断点

info breakpoints

 

查看断点设置情况

watch

监视点表达式

设置写监视点

rwatch

监视点表达式

设置读监视点

awatch

监视点表达式

设置访问监视点

info watchpoints

 

查看监视点设置情况,等价于info breakpoints 命令

set can-use-hw-watchpoints

布尔值

设置是否能够使用硬件断点

show can-use-hw-watchppints

 

显示能否使用硬件断点,0不可以,1可以

catch event

要捕捉的事件:比如throw catch exec fork 

捕捉程序运行时发生的事件,目前不支持

clear

函数名 行号或者地址

删除断点

delete [breakpoints][range…]

断点号或者断点号范围

删除断点

disable[breakpoints][range…]

断点号或者断点号范围

禁用断点

enable [breakpoints][range…]

断点号或者断点号范围

使能断点

enalbe[breakpoints]once range….

断点号或者断点号范围

使能断点一次

enable [breakpoints] delete range ….

断点号或者断点号范围

使能断点一次,触发断点一次后,将其删除

break ….if cond

断点号或者断点号范围

仅当条件为真时,断点有效

condition bnum expression

断点号

仅当条件为真时,断点有效

ignore bnum count

程序执行经过断点的次数

bnum 断点号 忽略count次经过断点

commands [bnum]

……command-list….

end

断点号

设置断点命令列表

补充:

在通过命令info breakpoints查看断点的信息时,

 

Num Type Disp Enb Address What
 1 breakpoint keep n 0x0804831 in main at test.c 10

        info breakpoints命令的输出分为6列,Num 列指明了断点所对应的断点号;Type 列指明了断点类型是指令断点还是监视点,Disp列指明了断点被触发之后应当如何处理,有3种处理方式,如果是keep,则断点在此次被触发之后依然有效,如果是del则在断点触发一次后就将被GDB自动删掉,如果是dis则断点被触发一次之后就将被禁用;End 列表明该断点是否处于使能状态;AddressWhat列指明了断点所在的源文件和相应 的行号。

       Braak  后面可以带有的参数有:不带参数时,表示在所选的栈帧中将要被执行的下条指令处设置断点。

 break funtion

break  + offset

break  -offset 在当前执行的行之前或之后offset行处设置断点

break  linenum 在当前尖文件中指定的行号linenum上设置断点

break filename:linenum多个目标文件连接成可执行的文件时,使用

break filename:function 多个目标文件连接成可执行的文件时,使用

break * address 在指定的内存地址上设置断点

监视点,断点,捕捉点区别:

监视点:是和种特殊的断点,与指令断点不同,它不是位于程序正文段中的。任何时候,只要当它年监视的表达式发生变化,如某个变量发生变化,就会导致程序交出控制权,进入调试器中。从职能上看,条件断点是面向指令的,而监视点是面向数据的。

捕捉点:它是在某些事件发生的情况才会被解恨。捕捉点的作用是让调试器在程序发生某种事件的时候暂停。断点是在程序执行到某个指令时被触发。

Condition bnum expression 使用
先使用break linenum 
(gdb)condition 1 b =3
Condition bnum expression bnum 是断点号,expression是要设置的断点的条件

    断点命令列表,通过断点命令列表,可以在指定当断点也可以是监视点或者是捕捉点时,被触发时要上GDB执行的一系列命令。比如可以,当断点被触发后打印某些表达式的值,或者使用某些其他的断点。

commands [bnum]
……command-list….
end

 

 来源:http://blog.chinaunix.net/uid-20788636-id-1841301.html

调用运行命令

 

命令

参数含义

说明

continue

 

令程序继续运行

step

 

单步步入(进入函数)

next

 

单步步过

finish

 

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

until

 

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

stdpi

 

指令级单步步入

nexti

 

指令级单步步出

print /f expr

要打印的表达式。其中可以是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个函数栈帧

栈帧回溯

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()中暂停时形成的栈帧如下图所示。

 

 

 

相关博文 首页 上页 1 2 3 4 下页 尾页 共4条
操作:

Please Login (or Sign Up) to leave a comment