一、打开GDB
1、gdb filename
加载该文件到gdb
2、gdb
file filename
如果gdb filename失败,可以在打开gdb以后,通过file来加载调试文件
3、gdb -tui
file filename
带画面的调试
如果显示上图的信息说明,没有指定文件,或者没有调试信息。
*注意-g,在linux下用gcc编译时,如果不加-g,编译器会进行优化,就不会生成调试信息,无法调试,也可以使用-ggdb,这是gcc为gdb提供的更详细的调试信息,别的调试器无法使用。
二、常见命令
l(list):显示代码,list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12,list 函数名:将显示“函数名”所在函数的源代码,如:list main;
b(break):设置断点,参数可以是行数,函数名,也可以用文件名:行数或者文件名:函数名;
tb(tbreak):临时断点,参数和b的一样;
info b(i b/info break):查看断点,查看断点;
例:如下图,通过b设置断点,如果要为断点指定源文件,使用b helloworld.c:10(源文件名:行数或者函数名),列Num的数字123是断点序号,Disp为keep的表示为普通断点,为del的则为临时断点,Enb是断点是否有效,y为有效,无效为n
clear n:清除第n行的断点;
d (delete) n:删除第n个断点;
disable n:暂停第n个断点;
enable n:开启第n个断点;
例:下图是删除断点和暂停开始和清楚的示例
r (run):执行程序;
s(step):有函数时,进入函数函数体,没有时,单步执行;
n (next):单步执行,不进入函数体;
c (continue):遇到断点以后,程序会阻塞,输入c可以让程序继续执行;
p (print):打印表达式,表达式可以是变量,也可以是操作,也可以是函数调用 print 1,print a+1 print f(a);
until:可以运行程序直到退出循环体;
finish:运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息;
watch:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序;
frame n:移动到指定的栈帧,并打印栈的信息,n为帧编号,如果不指定n,打印当前栈的信息;
set args 参数:指定运行时的参数;
show args:查看设置好的参数;
show paths:查看程序运行路径;set environment varname [=value] 设置环境变量。show environment [varname] 查看环境变量;
cd 相当于shell的cd;
pwd :显示当前所在目录;
info program: 来查看程序的是否在运行,进程号,被暂停的原因;
bt(backtrace):查看堆栈信息,因为栈是后进先出,所以要从下往上看,最下面的是最先执行的函数;
threads:查看所有线程信息;
shell XXX:执行shell命令行,XXX为shell命令,如shell ls就执行shell里的ls命令;
thread n:切换线程,参数为线程号,可以通过threads查看,一般常用的是通过threads查看线程序号,通过thread n切换过去,再用bt查看线程栈的信息;
condition:给断点设置触发条件,比如b 10 if a > b与b 10然后condition 1 if a> b等价(假设b 10的断点号为1),取消断点条件用condition 断点号;
ignore:特殊断点条件,程序只有到达该断点指定次数以后才会触发,ignore 1 10,忽略断点号为1的断点10次以后才触发;
kill:将强行终止当前正在调试的程序;
help 命令:help 命令将显示“命令”的常用帮助信息;
call 函数(参数):调用“函数”,并传递“参数”,如:call gdb_test(55);
layout:用于分割窗口,可以一边查看代码,一边测试;
layout src:显示源代码窗口;
layout asm:显示反汇编窗口;
layout regs:显示源代码/反汇编和CPU寄存器窗口;
layout split:显示源代码和反汇编窗口;
display: 在每次单步进行指令后,紧接着输出被设置的表达式及值;
stepi或nexti:单步跟踪一些机器指令;
Ctrl + L:刷新窗口;
quit:简记为 q ,退出gdb;
回车:重复上一条命令;
执行下一步操作,注意命令行此时显示的并不是当前执行的操作,而是下一次要执行的。