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 参数

### GDB调试基础 GDB 是 GNU 调试器 (GNU Debugger),用于调试 C 和 C++ 程序。它允许开发者分析崩溃原因并逐步跟踪程序运行过程中的状态变化。 #### 编译带有调试信息的程序 为了能够使用 GDB 进行有效的调试,必须在编译阶段加入 `-g` 参数以包含调试符号表。这可以通过 GCC 或其他支持此选项的编译器完成[^2]。例如: ```bash gcc -g -std=c99 -o bug bug.c ``` 上述命令会生成名为 `bug` 的可执行文件,并附带完整的调试信息。 #### 启动 GDB 并加载目标程序 通过指定目标二进制文件作为参数来启动 GDB。如果成功读取到符号信息,则会在终端显示类似于 “Reading symbols from...done.” 的消息[^1]。以下是具体操作方式: ```bash gdb demo1 ``` 此时进入交互模式,在这里可以输入各种指令控制被调试的应用进程行为。 #### 基本GDB命令概览 - **run**: 开始或重新开始程序执行。可以选择提供命令行参数给待测应用。 ```bash run arg1 arg2 ... ``` - **breakpoint 设置断点**: 可以按函数名或者源码行号设置停止点以便更细致地观察变量值的变化情况。 ```bash break main # 在main函数入口处设停靠位 break filename.c:line_number # 定义特定位置上的暂停标记 ``` - **step/next 单步执行**: step 会深入调用子功能内部;而 next 则仅跨越当前语句而不展开其细节。 ```bash step # 步入下一个逻辑单元(可能跳转至另一方法) next # 继续直到下一条顶层表达式被执行完毕 ``` - **print 查看变量值**: 动态获取内存中存储的数据实例。 ```bash print variable_name # 输出某个已声明对象的内容 ``` - **continue 恢复流程直至下一断点到达前继续正常运转** ```bash continue # 让应用程序按照常规顺序前进,除非遇到新的障碍物才会再次中断下来等待进一步指示 ``` - **quit 结束会话退出工具界面返回shell环境当中去** ```bash quit # 关闭整个工作区离开debugger回到操作系统提示符之下 ``` 以上只是部分常用特性介绍而已,实际上还有许多高级技巧可供探索学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值