GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。 对于一名Linux下工作的c/c++程序员,gdb是必不可少的工具;
GDB使用
1.启动gdb
gcc -g hello.c hello -o hello //编译hello.c -g表示调试 -o 输出编译文件hello
gdb hello //启动gdb
gdb -q hello //启动gdb -q 不打印gdb版本信息
gdb hello 带版本信息
gdb -q hello
2.查看源码
list (简写l):查看源程序代码,默认显示10行。回车键,显示接下来10行
list 用法:list + 行号 将会显示行号为中心的10行内容
list + 函数名 会显示为该函数名的函数内容
3.运行程序
run (简写r)运行程序直到遇到 结束或者遇到断点等待下一个命令;
until:运行程序直到退出循环体;
until+行号: 运行至某行,不仅仅用来跳出循环
4.设置断点
break(简写 b) :格式 b + 行号,在某行设置断点;
info breakpoints :显示断点信息
断点信息包括如下:
Num: 断点编号
Disp:断点执行一次之后是否有效 kep:有效 dis:无效
Enb: 当前断点是否有效 y:有效 n:无效
Address:内存地址
What:位置
断点其他操作
delete + 断点号n:删除第n个断点
disable + 断点号n:暂停第n个断点
enable + 断点号n:开启第n个断点
clear + 行号n:清除第n行的断点
5、单步执行
使用 continue(简称c) step(简称s) next(简称n)
continue (简写c ):继续执行,到下一个断点处(或运行结束)
next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。
step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的
6、查看变量
print + 变量名 打印变量
print ++a:将把 a 中的值加1,并显示出来
print value:将显示字符串 value的值
print test(12):将以整数12作为参数调用 test() 函数
print test(a):将以变量 a 作为参数调用 test() 函数
其他:
display a 该命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置参数a值
whatis + 变量名 打印变量类型
7、退出函数或退出调试
return (简写ret)退出前执行函数
quit (简写 q) 退出调试
其他:
where/bt :当前运行的堆栈列表;
bt backtrace 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数:指定运行时的参数
show args:查看设置好的参数
info program: 来查看程序的是否在运行,进程号,被暂停的原因
窗口设置:
layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
Ctrl + L:刷新窗口