1.gdb参数列表
启动程序准备调试
gdb your_proceduce
或者先输入gdb,然后输入 file your_proceduce
然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传递给该程序
参数列表:
命令 |
命令缩写 |
命令说明 |
list |
l |
显示多行源代码 |
break |
b |
设置断点,程序运行到断点的位置会停下来 |
info |
i |
描述程序的状态 |
run |
r |
开始运行程序 |
display |
disp |
跟踪查看某个变量,每次停下来都显示它的值 |
step |
s |
执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 |
next |
n |
执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
print |
p |
打印内部变量值 |
continue |
c |
继续程序的运行,直到遇到下一个断点 |
set var name=v |
|
设置变量的值 |
start |
st |
开始执行程序,在main函数的第一条语句前面停下来 |
file |
|
装入需要调试的程序 |
kill |
k |
终止正在调试的程序 |
watch |
|
监视变量值的变化 |
backtrace |
bt |
产看函数调用信息(堆栈) |
frame |
f |
查看栈帧 |
quit |
q |
退出GDB环境 |
2.断点设置
使用break进行打断点 ,简写为b。
可以对某一行进行打断点 例:对程序的第三行进行打断点 b 3;如果是多个文件,可以对某个文件的某一行打断点, 例:对gdb_test.c的第三行打断点 b gdb_test.c:3。
可以对某个函数进行打断点 例:对本程序中func()函数打断点 b func;同理也可以对多个文件中的某一个文件的函数打断点,例: b gdb_test.c:func。
如果我们想删除某个断点,有种方法:
(1) delete 命令 简写d
delete break 删除所有的断点;
delete break n 删除某个断点 n为断点号。
(2) clear 命令
clear 行号 删除设在某一行的断点;
这两种删除断点的用法就在于一个是依据断点号删除,一个是依据行号删除。
也可以通过如下方法禁用或打开断点:
disable break n 禁用某个断点 n为断点号;
enable break n 使能某个断点 n为断点号。
其中断点号的查询可以使用命令:
info b 查看所有断点信息;
info b n 查看第n个断点的信息。
3.调试中查看源码
若在调试中需要查看源码,可使用如下命令:
(1) list 命令或者简写l
(2)使用 layout src
第二种方式打开源码窗口,使用更方便。layout src中可使用ctrl+L清空屏幕显示。
layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
layout src:显示源代码窗口
layout asm:显示汇编窗口
layout regs:显示源代码/汇编和寄存器窗口
layout split:显示源代码和汇编窗口
layout next:显示下一个layout
layout prev:显示上一个layout
Ctrl + L:刷新窗口
Ctrl + x,再按1:单窗口模式,显示一个窗口
Ctrl + x,再按2:双窗口模式,显示两个窗口
Ctrl + x,再按a:回到传统模式,即退出layout,回到执行layout之前的调试窗口。
4.调试中查看源码
单步调试可以使用 n,
跳转下一条语句用s,常用于进入某个函数体。
程序奔溃可以通过指令 bt 查看堆栈信息
查看所有线程堆栈信息
thread apply all bt
参考上述的参数列表。
4.多线程
选项 |
作用 |
info threads |
列出所有线程 |
thread n |
切换到指定的线程,n是线程编号 |
set scheduler-locking on |
只运行当前线程,锁住其他线程 |
set scheduler-locking on step |
单步执行当前线程时,锁住其他线程 |
set scheduler-locking off |
运行当前线程,同时运行其他线程 |
info threads
显示可以调试的所有线程。gdb会为每个线程分配一个ID(和tid不同),编号一般从1开始。后面的ID是指这个ID。
thread ID
切换当前调试的线程为指定ID的线程。
thread apply ID1 ID2 IDN command:
让线程编号是ID1,ID2…等等的线程都执行command命令。
thread apply all command:所有线程都执行command命令。
set scheduler-locking off|on|step:
在调式某一个线程时,其他线程是否执行。在使用step或continue命令调试当前被调试线程的时候,其他线程也是同时执行的,如果我们只想要被调试的线程执行,而其他线程停止等待,那就要锁定要调试的线程,只让他运行。
off:不锁定任何线程,默认值。
on:锁定其他线程,只有当前线程执行。
step:在step(单步)时,只有被调试线程运行。
set non-stop on/off:
当调式一个线程时,其他线程是否运行。
set pagination on/off:
在使用backtrace时,在分页时是否停止。
set target-async on/ff:
同步和异步。同步,gdb在输出提示符之前等待程序报告一些线程已经终止的信息。而异步的则是直接返回。
show scheduler-locking:
查看当前锁定线程的模式。
5.浏览栈帧
选项 |
作用 |
backtrace |
显示栈的所有帧。bt等同于backtrace |
frame n |
设置帧n为当前帧 f n |
up |
设置父帧为当前帧 |
down |
设置子帧为当前帧 |
frame |
显示当前帧 |
info frame |
显示当前帧的局部变量、形参等信息 |
info args |
显示当前帧的参数 |
info locals |
显示当前帧的本地变量 |
info reg |
显示当前帧的寄存器 |
6.调试正在运行进程
1.命令gdb your_proceduce 2570 可以附加到这个进程上。被时进程会中断。(2570是进程ID)
2.或者在GDB里输入attach 2570同样可以附加到进程。
提示上述错误时,可以按照上图设置,或者用root权限启动gdb。
6. 升级gdb版本
Ubuntu16.04升级gdb7.11升级到10.2版本
CentOS7安装gdb错误提示:GMP is missing or unusable
yum install gmp-devel.x86_64