【Linux】工具(5)——gdb
今天我们来到Linux工具的最后一篇博客:gdb的使用
目录
一、Linux下的release和debug
二、gdb常用指令选项
一、Linux下的release和debug
我们先来写一个Makfile,来方便我们编译代码:
再来写一个test.c的源文件:
接着我们使用make来编译一下源文件:
可以看到编译没有通过
这是因为当前gcc编译的标准不支持在for循环中定义变量,但是我们可以在gcc指令后面加上-std=c99就可以按照c99的标准来编译代码:
接着我们再使用make来编译一下:
编译完成生成了运行文件,我们来运行一下:
光运行已经不能满足我们了,我们需要进行调试,这时就轮到gdb上场了,具体使用方法:
# gdb 要调试的可执行文件
我们现在试了一下,发现并不能正常调试,主要是缺少了调试信息:
这是因为在Linux环境下gcc/g++默认编译的代码是release版本
debug版本:程序本身会被加入更多的调试信息 以便于进行调试
release版本:不会添加任何调试信息 是不可调试的
我们在linux中默认生成的文件都是release版本的 是不可以使用gbd调试的
如果我们想要它可被调试则需加入debug信息
具体指令如下:
# gcc test.c -g -o test_debug.exe -std=c99
即在gcc指令上加上-g选项即可(表示生成debug版本的可执行程序)
我们可以发现debug版本的可执行程序比release版本的可执行程序大一些,这是因为debug版本的含有调试信息
下面我们再来使用gdb进行调试:
这时就成功了
二、gdb常用指令选项
【l 行号】:显示binFile源代码,接着上次的位置往下列,每次列10行。
【l 函数名】:列出某个函数的源代码。
【r】:从头开始连续而非单步执行程序
【n】:单条执行
【s】:进入函数调用
【c】:从当前位置开始连续而非单步执行程序
【b 行号】:在某一行设置断点
【b 函数名】:在某个函数开头设置断点
【info b】 :查看所设置的断点信息
【finish】:执行到当前函数返回,然后挺下来等待命令
【p 变量名】:打印变量值
【set variable 变量名】:修改变量的值
【delete breakpoints】:删除所有断点
【delete breakpoints n】:删除序号为n的断点
【disable breakpoints n】:禁用序号为n的断点(禁用后该断点不起作用,但并没有删除)
【enable breakpoints n】:启用序号为n的断点
【display 变量名】:跟踪查看一个变量,每次停下来都显示它的值(变量常显示)
【undisplay 变量名】:取消对先前设置的那些变量的跟踪
【until 行号】:运行至所给行号处停下
【bt】:查看各级函数调用及参数
【info locals】:查看当前栈帧局部变量的值
【q】:退出gdb
感谢各位的阅读,我们下一期见