前言
在windows系统vs系列下写的c/c++程序可以调试,在linux系统下同样对于自己写的程序也是可以调试的,不过对于写的一般程序发布的版本是release版本的,但是在需要调试是要程序是以debug版本发布的,在编译时要加选项 ''-g''使发布的软件以可以调试的版本发布,而如何知道程序是什么版本发布的,在linux下使用命令readelf -S +可执行程序名然后管道过滤debug若是有debug则为debud版本发布,没有就是release版本发布
因为程序中含有调试信息,以gdb工具进行调试
一、gdb工具是什么?
gdb是一个基于命令行的调试工具!它是linux的一个调试工具。
那么如何进入调试?
将带-g选项的编译好的可执行程序使用gdb调试
这是进入调试模式下,让程序可以被调试。界面上会出现gdb)这样就是在调试模式下了。
二、linux调试常用选项
gdb模式下它是会自动记录下最近历史指令的!
1)l 查看程序
可以查看源程序代码,但是它只能一次显示10行代码,并且默认从中间开始显示,也可以在它后面紧跟要查看程序的行号或者函数名,也可以是文件名
2)r 执行调试
是运行程序的意思,将程序跑起来,若是没有遇到断点则会将程序运行完毕!但是遇到断点就会停下,并且再次r的时候它还是从头开始运行并不是从断点处开始运行,若是打了断点之后想继续执行后面的代码程序,则要使用选项c 它可以跟着后面继续执行,跳转到下个指定断点
3)q 退出调试
退出调试模式,退出调试模式之后以前打的所有断点信息全部清除,再次进入调试模式时是一个白板!
4) b 设置断点
打断点可以在指定行号打,亦可以在指定函数名或者文件名打断点 断点设置之后查看断点信息用info b就可以查看断点信息了
断点信息中有排列的数字,那是断点对应的编号,在删除断点时就需要用到!而 d就是取消断点,他后面跟的不是行号或者函数名那些,而是设置断点时断点对应的断点编号
5) s 逐语句 n逐过程
在调试时我们需要一步一步的走,有时也要进入函数内部去查看代码执行的效果。一个是逐过程,一个是逐语句的,进入函数内部是一条语句一条语句的执行,它是s选项。而逐过程是一个过程一个过程的走,相对来说函数调用语句是一个过程,它是n选项。而在函数内部没有再调用其他函数或者其他的那么两者随意变换都是无所谓的!
6) p 查看变量的变化
这是对应vs中的监视窗口,可以观察一个变量在调试运行程序时对应的变化,但是这只是相对来说一次的变化,那么要一直显示变量的变化,dispaly 可以常显示变量的值的变化
,一直给显示出来,就是开的一个监视窗口,它常显示的变量有一个编号。关掉常显示undisplay是取消的是编号。要修改变量的值用set var +变量名
7)until finish
until是当进入某个循环时一时间退不出来,但是又想里面退出来,则用until+指定号,可以跳转到想要的行号,然后就可以退出循环了!finish是当进入一个函数时你立马执行完函数并且返回
8)disable && enable
disable是可以禁掉断点,是让断点不起作用的,这样r时就会直接忽略掉这个断点,但是若是又想看这个断点了的话,enable又可以打开禁用的断点,他们之后都是加断点编号