一.gdb调试器 程序开发过程中免不了会有一些错误出现,那么就需要对程序进行调试了,在windows中vs直接集成了各种调试工具。在linux中我们需要安装一个额外的调试器,gdb调试器(GNU debugger)是linux下一个c/c++的强大的调试器。其主要功能: 设置断点单步执行查看变量动态改变环境 输入gdb -v可以查看系统中gdb版本,没有则说明未安装gdb。若是系统没有安装gdb调试器,可以输入:sudo yum install gdb 直接在线安装(离线方法较麻烦,不推荐)。 gdb filename 就可以直接进入gdb调试器,注意这里的filename文件在编译是需要-g这样文件才包含有调试信息,-g后面可以接数字1,2,3表示级别,级别越高信息越多ex:-g1 ,-g2。-ggdb是gdb专用的,与-g相同。 二.gdb常用命令: filename :装入要调试的可执行文件 run :执行当前调试程序 kill :终止当前调试程序 step :执行一行代码进入函数内部 next :执行一行代码不进入函数内部 break :设置断点 print :打印表达式或变量的值 display :设置自动显示的表达式或变量 list :列出产生执行文件的源代码的一部分 watch :监视变量的值 return :强制函数返回 gdb对程序进行调试的基本过程:gdb filename,进入调试;因为进入调试后直接run的话程序会直接运行退出,这样就无法进行调试了,因此在run之前,需要先设置断点break(同时也可以添加需要显示或监视的变量);这样程序运行到断点处就自动停下来了,这时就可以进行基本的调试,next和step都是向下执行一行代码,区别在于遇到函数的话step会跳转到函数内部执行一行,而next不会;这时可以用print打印出变量的值,之前也可以display设置变量显示,即在调试过程中变量有变化时会自动显示它的值; 三.断点的设置与删除 break linenumber :在特定行设置断点 break fun :在函数处设置断点 break :没有参数,在下一行设置 break if condition :在特定条件下有断点(停止运行) clear linenumber :清除所在行号的断点 clear fun :清除函数所在的断点 clear :清除所有断点 delete b_id :清除指定断点编号的断点 enable/disable b_id :使指定断点编号的断点有效/失效 info breakpoints :查看当前设置断点信息(编号,是否有效,位置) display:自动显示变量 display 表达式 :添加自动显示的表达式或变量 info display :查看当前设置信息 delete display number :删除指定编号的display信息 undisplay number :同上 disable/enable display number :使指定编号的display暂时无效/有效 list显示源代码 list :输出当前行前后的源代码 list n: 输出第n行前后的10行代码 list fun :输出函数fun前后的10行代码 list n,m:显示n到m行的代码 list,m:显示当前到m行的代码 show listsize:显示list设置,即默认显示几行,一般为10 set listsize count :设置默认显示行数 其他常用调试命令 whatis 变量或表达式 :显示某个变量或表达式的数据类型 jump 行号:让程序跳到指定行开始调试 print 变量或表达式:打印变量或表达式的值。 print 变量=值:对变量进行赋值。 continue:遇到断点停止后,继续运行 show language:查看当前语言环境. info source: 查看当前文件语言 until :在执行完循环体内的最后一条语句之后执行 until, 就会执行完循环体 until m:继续运行到m行 finish:执行完当前的函数 set args 参数:指定运行时的参数 show args:查看设置好的参数 线程调试命令 info threads:查看当前进程的线程 thread id:切换调试的线程为指定ID的线程 break file.c:100 thread all:在file.c文件第100行处为所有经过这里的线程设置断点 set scheduler-locking off|on|step:在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,off:不锁定任何线程,也就是所有线程都执行,这是默认值。on:只有当前被调试程序会执行。step:在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行 hread apply ID1 ID2 command:让一个或者多个线程执行GDB命令command thread apply all command:让所有被调试线程执行GDB命令command set follow-fork-mode child:fork之后调试子进程,父进程不受影响 set follow-fork-mode parent:fork之后继续调试父进程,子进程不受影响 attach pid:附着(attach)到正在运行的进程,pid为进程号命令简称 在gdb中许多命令都有简写:例如run可以用r代替,下面简要说明: run :r next:n step :s break :b delete:d list:l print:p continue:c info:i quit:q