一、gdb是什么
在Linux下编写代码时,你是否常常因为查找bug而半夜无法入睡?你是否在程序一晃而过时而一脸发懵?这个时候,你是否常常想想念在某些IDE上可以调试的快乐的日子?哥们哥们,坚持住,Linux也有调试器的!这个调试器就是gdb!
二、怎么使用gdb
1.需要在编译时加上 -g
因为程序有debug版本和release版本两种,前者具有调试信息,后者是程序优化版本,而Linux下gcc/g++出的版本默认是release版本,所以想要调试,需要在编译时加上 -g:
gcc -o mytest-debug test.c -g
2.启动gdb
启动gdb使用gdb xxx命令,xxx为你编译好的debug版本可执行程序:
3.指令介绍
(1)l 行数/main ——查看指定行内容
这个查看会显示出指定行上下加起来的十条指令,方便上下的代码理解指定行,看完后再输入 l ,显示剩下内容,再回车,显示统计的代码行数量。如下:
(2) r ——运行程序 c—— 继续运行
需要注意的是,r是每次重新运行程序,遇到断点停止,c是停下后继续运行,如下:
(3)b 文件:行数 ——给指定行打入断点
info b ——查看断点信息
d 编号 —— 删除断点
需要注意的是,删除断点时,采用的是断点编号,且当你是多文件编写时,可以指定在某个文件第几行打断点。如下:
(4)n —— 逐过程 s —— 逐语句
逐过程以函数为单位,不进入函数,逐语句以语句为单位,会进入函数。如下:
(5)p 变量 ——查询变量值
display 变量 ——常显示
undisplay 编号 ——取消常显示
一般调试最常用的监视,就在此了。使用如下:
(6)until 行号 ——在函数内运行到指定行
这个命令不需要如其他IDE上打上断点才能运行到指定行。在gdb里输入行号即可,运行 到指定行,不过此功能在函数内才可以完整实现,在main函数里会一个一个函数跳转。使用 如下:
三、指令全称及其他指令
其实上文许多的指令都是为了快速调试而简写的指令,下面是指令的全称,以及我们平常调试不常用的指令,以供参考使用:
list/l 行号 :显示 binFile 源代码,接着上次的位置往下列,每次列 10 行。list/l 函数名 :列出某个函数的源代码。r或run :运行程序。n 或 next :单条执行。s或step :进入函数调用break(b) 行号:在某一行设置断点break 函数名 :在某个函数开头设置断点info break :查看断点信息。fifinish :执行到当前函数返回,然后挺下来等待命令print(p) :打印表达式的值,通过表达式可以修改变量的值或者调用函数p 变量 :打印变量值。set var :修改变量的值continue(或c) :从当前位置开始连续而非单步执行程序run(或r) :从开始连续而非单步执行程序delete breakpoints :删除所有断点delete breakpoints n :删除序号为 n 的断点disable breakpoints :禁用断点enable breakpoints :启用断点info(或i) breakpoints :参看当前设置了哪些断点display 变量名 :跟踪查看一个变量,每次停下来都显示它的值undisplay 编号 :取消对先前设置的那些变量的跟踪until 行号 :跳至 X 行breaktrace( 或 bt) :查看各级函数调用及参数info ( i) locals :查看当前栈帧局部变量的值quit/ctrl+d :退出 gdb