如果要对一个main程序进行gdb调试,那就在编译时要加上-g选项
g++ -g main.cpp -o main
设置断点:
break 行号/函数名 简写:b 行号/函数名
break 文件名:行号(当源文件不止一个)
显示各个断点的详细信息:
info break,简写:info b
Num: 断点编号
Disp:断点执行一次之后是否有效 kep:有效 dis:无效
Enb: 当前断点是否有效 y:有效 n:无效
Address:内存地址
What:位置
令断点失效/生效:
disable 1(断点的编号,通过info break查看):令1号断点失效
enable 1:令1号断点生效
删除断点:
delete 1:删除1号断点
运行程序:
run,简写为r:其作用是开启运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令,在调试过程中可以通过输入r来重新开启调试;
continue,简写为 c: 继续执行程序,直到下一个断点或者结束;
step,简写为s:单步执行,如果有函数调用,则进入函数;
next,简写为n,单步执行,当遇到函数调用时,不进入函数体;
finish: 一直运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址,返回值,及参数值等信息,通常用于结束一个子函数的运行;
until:退出当前循环体,运行程序直到退出循环体;
打印变量的值:
print i(变量名称)简写:p i
打印数组的值:
p arr[0]:打印arr数组第一个值
p arr[0]@5:打印arr[0]开始的5个值
以16进制显示变量值:
p/x i:以16进制显示i的值
显示变量的地址:
p &a:显示变量a的地址
退出调试:
quit,简写为q
条件断点:
b 21 if a==3:只有a等于3才会在21行停下来
运行程序时手动改变变量的值:
set variable i=1000:将i的值改为1000
监事变量:
watch a:监视变量a,一旦a的值改变,程序将停下,并显示a的旧值和新值
人工设置函数返回值:
return ***:结束正在运行的子程序,并以返回值返回
查看当前运行所在位置:
where/backtrace(两个命令作用一样)
上面这个结果是说当前停在add()函数里,位于main.cpp的第6行,而add函数又是在main()函数里被调用的,调用语句位于main.cpp第18行
简而言之:当前程序停在main()->18行->add()->第6行
回到上一层/下一层函数堆栈:
up/down
假设main()里面调用了add子函数,main()里面有一个i变量,如果此时调试停在add子函数里,那么p i 不能打印出main()中的i的值,此时可以先输入up回到上一层main()的堆栈,这时p i 就可以打印出main()中的i的值,down则回到原来的add子函数中
查看当前运行的行附近行的代码:
list,简写为l: 默认显示10行,按回车键继续看余下的
查看变量的类型:
whatis i
ptype i:明细地显示出变量的类型
运行上一条指令:
直接按回车即可运行上一条指令
运行shell命令:
shell ***:在调试过程中如果想运行shell命令
指定运行时的参数:
set args 参数