gdb调试

如果要对一个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 参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值