Linux调试器-gdb使用

目录

1.gbd的介绍

[主要的功能 :](#主要的功能 :)

基础用法总结:

2.gdb的基础操作

1.生成调试

2.启动gdb

3.退出gdb

4.查看源码

5.运行程序

6.断点的设置与操作

1.断点的设置

2.查看断点

3.断点的禁用与启动

1.断点禁用

2.断点重启

4.断点的删除

​编辑

​编辑

5.逐过程运行

6.逐语句运行

7.快速结束当前函数

8.运行至下一断点

9.打印变量值和取消

10.跳转到指定行


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 的值,可以看出跳转的代码都是运行后的 。

相关推荐
长潇若雪1 分钟前
《类和对象:基础原理全解析(上篇)》
开发语言·c++·经验分享·类和对象
the丶only15 分钟前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
书生-w16 分钟前
Docker部署GitLab服务器
服务器·docker·gitlab
Ling_suu26 分钟前
SpringBoot3——Web开发
java·服务器·前端
alden_ygq27 分钟前
etcd网关
服务器·数据库·etcd
ccubee44 分钟前
docker 安装 ftp
运维·docker·容器
枫叶红花1 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
yaosheng_VALVE1 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
_微风轻起1 小时前
linux下网络编程socket&select&epoll的底层实现原理
linux·网络