分类: LINUX
2016-05-06 16:32:15
原文地址:GDB命令使用总结(一) 作者:frankzfz
在GCC中,-g选项可以生成的可执行程序中加入调试信息。调试信息保存在目标文件中,它描述的内容包括变量的数据类型,函数的原型声明,程序符号表,行号,与指令之间的对应关系,等等。-g完整形式是-glevel,其中,level中指定了调试信息中包括了调试信息的多少,默认的是2,1最少,level=3最多。
假设现在有一个程序文件,文件名为test.c,而且需要一个参数做为输入的话,
我们可以这样编译这个程序:
|
|
,也可以在启动GDB以后再把程序加载到GDB的调试环境中
|
要是指定参数的话可以这样 run 10,在命令run 后面加上参数
还有一种方法就是通过set args命令
|
命 令 |
参 数 含 义 |
说 明 |
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命令时,还是可以设置环境变量,
|
输入输出重写向
|
> 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查看断点的信息时,
|
info breakpoints命令的输出分为6列,Num 列指明了断点所对应的断点号;Type 列指明了断点类型是指令断点还是监视点,Disp列指明了断点被触发之后应当如何处理,有3种处理方式,如果是keep,则断点在此次被触发之后依然有效,如果是del则在断点触发一次后就将被GDB自动删掉,如果是dis则断点被触发一次之后就将被禁用;End 列表明该断点是否处于使能状态;Address和What列指明了断点所在的源文件和相应 的行号。
Braak 后面可以带有的参数有:不带参数时,表示在所选的栈帧中将要被执行的下条指令处设置断点。
break funtion
break + offset
break -offset 在当前执行的行之前或之后offset行处设置断点
break linenum 在当前尖文件中指定的行号linenum上设置断点
break filename:linenum多个目标文件连接成可执行的文件时,使用
break filename:function 多个目标文件连接成可执行的文件时,使用
break * address 在指定的内存地址上设置断点
监视点,断点,捕捉点区别:监视点:是和种特殊的断点,与指令断点不同,它不是位于程序正文段中的。任何时候,只要当它年监视的表达式发生变化,如某个变量发生变化,就会导致程序交出控制权,进入调试器中。从职能上看,条件断点是面向指令的,而监视点是面向数据的。
捕捉点:它是在某些事件发生的情况才会被解恨。捕捉点的作用是让调试器在程序发生某种事件的时候暂停。断点是在程序执行到某个指令时被触发。
|
断点命令列表,通过断点命令列表,可以在指定当断点也可以是监视点或者是捕捉点时,被触发时要上GDB执行的一系列命令。比如可以,当断点被触发后打印某些表达式的值,或者使用某些其他的断点。
|