一.安装gdb
输入下列命令
yum -y install gdb
二.常用命令
编译时加-g选项,且-o优化项不可使用,例如:
g++ -g -o demo demo.cpp
调试前首先要 gdb 目标程序,例如:
gdb demo
命令:
1.set args 用于设置程序运行的参数,方法是 set args 参数1 参数2 参数3 ...
2.break 用于设置断点 简写:b 例如b 7 就是在第七行设置断点,次数不限。
3.run 开始运行程序 简写:r 遇到断点停止 。
4.next 执行当前行语句 简写:n 如果行语句调用了函数,不会进入函数体内部。
5.step 也是执行当前行语句 简写:s 不同于next的是如果调用的不是库函数或者第三方函数,而是自定义有源码的函数则可以加入函数内部。
6.print 显示变量或表达式的值 简写:p 值得一提的是如果p一个表达式,会执行这个表达式,例如:
p 程序中变量i
显示执行到当前位置i的值
p 表达式ii+1
显示执行到当前位置ii的值+1,假设程序中有一个for(int ii{};ii<100;ii++){},那么循环就会少一次
p 与程序无关的表达式
显示表达式计算结果
7.continuen 继续运行程序,遇到断点停止,继续continue则继续跑下去 简写:c。
8.set var 设置变量的值,例如有两个变量int ii和char str[21]:
set var ii=7
set var str[21]="fish"
三:gdb调试core文件
如果程序在运行的过程中发生了内存泄漏,会被内核强行终止,提示“段错误(吐核)”,内存的
状态将保存在 core 文件中,方便进一步分析。而Linux 缺省不会生成 core 文件,需要修改系统参数,步骤如下:
1.首先用ulimit-a查看当前用户的资源限制参数。
2.ulimit-c unlimited把core file size改为unlimited。
3.接着运行程序就可以产生core文件了。
4.运行 gdb 程序名 core 文件名。
5.在gdb中用bt命令查看函数调用栈。
例如:没有生成core文件之前
bt显示no stack
生成过程以及调试过程:
关注core file size(第一行),此外可以重点关注open fils,stack size这两个参数,根据字面意思也不难猜测,了解一下他们,此处不做赘述。
更改之后:
之后的调试按照上述步骤进行即可,注意,需要先确认目录中有了core文件,然后运行 gdb 程序名 core 文件名,bt才会有正确的显示。
四.gdb调试运行中的程序
gdb 程序名 -p 进程编号
查看进程编号的方法:用ps -ef |grep 程序名查看进程编号。
调试的时候跑着的程序会停下来,剩下的调试操作详见上述普通调试的内容。
基本的gbd使用方法就是这样了。