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

相关推荐
Ronin3058 小时前
【Linux系统】日志与策略模式
linux·策略模式·日志
qq_264220898 小时前
Nginx优化与 SSL/TLS配置
运维·nginx
猎板PCB黄浩8 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造
ZzzK,8 小时前
JAVA虚拟机(JVM)
java·linux·jvm
Aspiresky9 小时前
浅析Linux进程信号处理机制:基本原理及应用
linux·运维·信号处理
全栈工程师修炼指南10 小时前
告别手动构建!Jenkins 与 Gitlab 完美协作,根据参数自动化触发CI/CD流水线实践
运维·ci/cd·自动化·gitlab·jenkins
周周记笔记10 小时前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅10 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~10 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记
ajassi200010 小时前
linux C 语言开发 (八) 进程基础
linux·运维·服务器