目录
[主要的功能 :](#主要的功能 :)
1.gbd的介绍
- 程序的发布方式有两种,debug模式和release模式
编译时需要加上-g选项:编译源代码时必须使用**-g**参数保留调试信息,否则gdb无法进行调试。
编译器形成可执行文件时,会给给可执行程序增加调试信息。
主要的功能 :
- 设置断点:在程序的某一行代码上设置断点,当程序执行到这一行时会暂停并等待调试命令。
- 单步调试:逐行执行程序并观察每一行代码的执行情况,方便定位问题。
- 查看变量和内存:在调试过程中查看各个变量的值,检查它们是否符合预期,同时可以查看内存的内容,了解程序的内部状态。
- 捕捉错误:帮助捕捉程序的错误,包括内存访问错误、未处理的异常等,并在错误发生的地方停下来,提供相关信息。
基础用法总结:
|----------------------|---------------------------------|
| list(或l) | 显示源代码,默认前10行 |
| list(或 l)+行号 | 显示binFile源代码,接着上次的位置往下列,每次列10行。 |
| list(或 l) 函数名 | 列出某个函数的源代码。 |
| r 或 run | 运行程序。 |
| n 或 next | 逐过程执行。 |
| s 或 step | 进入函数调用 |
| break(b)+行号 | 在某一行设置断点 |
| break (b)函数名 | 在某个函数开头设置断点 |
| info break | 查看断点信息。 |
| finish | 执行到当前函数返回,然后停下来等待命令 |
| print(或p) | 打印表达式的值,通过表达式可以修改变量的值或者调用函数 |
| p 变量 | 打印当前变量值。 |
| set var | 修改变量的值 |
| continue(或c) | 从当前位置开始连续而非单步执行程序 |
| run(或r) | 从开始连续而非单步执行程序 |
| delete breakpoints | 删除所有断点 |
| delete breakpoints n | 删除序号为n的断点 |
| disable breakpoints | 禁用断点 |
| enable breakpoints | 启用断点 |
| info(或i) breakpoints | 参看当前设置了哪些断点 |
| display 变量名 | 跟踪查看一个变量,每次停下来都显示它的值 |
| undisplay | 取消对先前设置的那些变量的跟踪 |
| until X行号 | 跳至X行 |
| breaktrace(或bt) | 查看各级函数调用及参数 |
| info(或 i) locals | 查看当前栈帧局部变量的值 |
| quit(或q) | 退出gdb |
2.gdb的基础操作
后面的操作都是根据这个1加到100的代码进行操作。
1.生成调试
gcc -o [目标文件] [源文件] -g
cpp
gcc -o myprocess-debug myprocess.c -g
2.启动gdb
gdb + [目标文件]
cpp
gdb myprocess-debug
3.退出gdb
quit 或 q
4.查看源码
|---------------|---------------------------------|
| list(或l) | 查看源码默认生成前十行,回车向下继续显示十行 |
| list(或 l)+行号 | 显示binFile源代码,接着上次的位置往下列,每次列10行。 |
| list(或 l) 函数名 | 列出某个函数的源代码。 |
cpp
list (l)
cpp
list(l) + 行数
上下部分一起显示
cpp
list(l) + 函数
也是上下部分一起显示
5.运行程序
r 或 run
正常运行程序的情况:
6.断点的设置与操作
断点操作+ [目标文件]:[位置]
1.断点的设置
|--------------|-------------|
| break(b)+行号 | 在某一行设置断点 |
| break (b)函数名 | 在某个函数开头设置断点 |
分别在17和20行设置断点
cpp
break(b)+行号 也能写成 break(b)+ [目标文件]:行号 后面的断点的操作也是可以如此
cpp
break (b)函数名
2.查看断点
info(或i) breakpoints :参看当前设置了哪些断点
断点信息解释:
断点信息 | 说明 |
---|---|
Num | 断点序号,断点序号只增不减 |
Type | 断点类型,断点类型位 breakpoint |
Disp | 断点执行一次之后是否有效,有效为 keep 反之为 dis |
Enb | 断点使能,表示该断点是否被打开 |
Address | 断点处在哪个地址上 |
What | 断点的具体位置 |
3.断点的禁用与启动
|---------------------|------|
| disable breakpoints | 禁用断点 |
| enable breakpoints | 启用断点 |
1.断点禁用
disable [断点序号]
2.断点重启
enable [断点序号]
4.断点的删除
|----------------------|-----------|
| delete breakpoints | 删除所有断点 |
| delete breakpoints n | 删除序号为n的断点 |
注意:不是全部断点的删除的多个断点删除,只能单独一个个删除
删除所有断点:
5.逐过程运行
逐过程:
- 遇到函数调用时会一次性执行完该函数,不会进入函数体调试,且会跳过空行。
n 或 next :逐过程执行
这里17行跳到19行是因为源代码中18行是没有的
6.逐语句运行
逐语句
- 遇到函数调用时会一次性执行完该函数,会进入函数体调试,且会跳过空行。
s 或 step :进入函数调用
7.快速结束当前函数
finish 执行到当前函数返回,然后停下来等待命令
8.运行至下一断点
continue(或c):从当前位置开始连续而非单步执行程序
9.打印变量值和取消
|-------------|----------------------|
| p 变量 | 打印变量值。 |
| display 变量名 | 跟踪查看一个变量,每次停下来都显示它的值 |
| undisplay | 取消对先前设置的那些变量的跟踪 |
p + 变量 i :打印当前 i 的值
display 变量 i 和 sum :跟踪查看一个变量,每次停下来都显示它的值
undisplay + [序号]:取消变量跟踪显示
10.跳转到指定行
until +行号 跳转至某行
until +12 跳转至代码12行
从 i 和 sum 的值,可以看出跳转的代码都是运行后的 。