一.简介
GDB是一个由GUN开源组织发布的,UNIX/LINUX操作系统下的,基于命令行的程序调试工具。
release版本和debug版本区别
在Debug:Debug 通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。
Release:Release通常称为 发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。为用户的使用提供便利。
(在Linux下,我们编译代码时,默认是release版本。想让代码以debug形式发布,需要使用gcc -g)
二.使用
1.启动gdb
1.1.编译一个测试程序,-g表示可以调试
gcc -g test.c -o test
1.2.启动gdb
gdb test
2.查看源码
l(list):查看看程序代码,默认显示10行,l命令到代码末后继续l。
(1)l 数字num
表示查看num周围10行代码。l 1可从头查看源码。
(2)l -
表示查看上一个l命令查看的代码之前的10行
(3)l 数字num1,数字num2
表示查看num1-num2行的源码
(4)l 函数名
表示查看函数周围10行代码
(5)l 文件名XX:数字num
表示查看XX文件中第num行周围10行代码
(6)l 文件名XX:函数名f
表示查看XX文件中函数f周围10行代码
3.运行程序
(1)r(run):运行程序,直到遇到结束或断点停止
(2)start:执行程序至 main() 主函数的起始位置停止
1、默认情况下,run 指令会一直执行程序,直到执行结束。如果程序中手动设置有断点,则 run 指令会执行程序至第一个断点处;
2、start 指令会执行程序至 main() 主函数的起始位置,即在 main() 函数的第一行语句处停止执行(该行代码尚未执行)start 指令启动程序 == 先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序
4.设置断点
(1)b(break):在某行设置断点
用法:b+行号num
(2)info b(info breakpoints):显示当前程序的断点信息
其中每一列含义如下:
Num: 断点编号
Disp:断点执行一次之后是否有效( kep:有效 dis:无效)
Enb: 当前断点是否有效 (y:有效 n:无效)
Address:内存地址
What:位置
(3)d(delete):删除断点
用法:d+断点号num
(4)disable:暂停第n个断点
用法:disable+断点号n
(5)enable:开启第n个断点
用法:enable+断点号n
(6)clear:清除第n行断点
用法:clear+行号n
5.单步执行
(1)s:逐语句(类似vs的F11),会进入函数内部
(2)n:逐过程 (类似vs的F10)不会进入函数,直接调用函数
6.查看变量
(1)p(printf):打印表达式,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
用法:
print a:将显示整数 a 的值
print ++a:将把 a 中的值加1,并显示出来
print name:将显示字符串 name 的值
print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
7.退出gdb
q(quit)
指令补充:
1、查看运行信息
where/bt :当前运行的堆栈列表;
bt backtrace 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数:指定运行时的参数
show args:查看设置好的参数
info program: 来查看程序的是否在运行,进程号,被暂停的原因。2、运行命令
continue (简写c ):继续执行,到下一个断点处(或运行结束)
until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
until+行号: 运行至某行,不仅仅用来跳出循环
finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)
参考原文链接:https://blog.csdn.net/niyaozuozuihao/article/details/91802994