在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执行的一系列命令。比如可以,当断点被触发后打印某些表达式的值,或者使用某些其他的断点。
|