Linux调试器-gdb使用

server/2024/10/17 16:46:08/

目录

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

gcc -o myprocess-debug myprocess.c -g

2.启动gdb

 gdb + [目标文件]

gdb myprocess-debug

 

3.退出gdb 

 quit 或 q

 4.查看源码

 list(或l)查看源码默认生成前十行,回车向下继续显示十行
list(或 l)+行号显示binFile源代码,接着上次的位置往下列,每次列10行。
list(或 l) 函数名列出某个函数的源代码。
list (l)

list(l) + 行数

上下部分一起显示 

list(l) + 函数

也是上下部分一起显示 

5.运行程序 

 r 或 run

正常运行程序的情况: 

6.断点的设置与操作 

断点操作+ [目标文件]:[位置]     

1.断点的设置
break(b)+行号在某一行设置断点
break (b)函数名在某个函数开头设置断点

 分别在17和20行设置断点

break(b)+行号   也能写成 break(b)+ [目标文件]:行号 后面的断点的操作也是可以如此

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


http://www.ppmy.cn/server/131755.html

相关文章

牛客小白月赛102(A,B,C,D,E)(思维,分层图,换根dp)

比赛链接 牛客小白月赛102 A题 思路 用 s e t set set检查 1 1 1~ k k k是不是全都出现过。 代码 #pragma GCC optimize("O2") #pragma GCC optimize("O3") #include <bits/stdc.h> using namespace std; #define int long long const int N …

nvm 常用命令清单

安装特定版本的 Node.js nvm install <version> 例如&#xff1a;安装 Node.js 20.15.0 nvm install 20.15.0 列出所有可安装的 Node.js 版本 nvm ls-remote 卸载某个 Node.js 版本 nvm uninstall <version> 例如&#xff1a;卸载 Node.js 20.15.0 nvm un…

底层框架和工具链

整体说明 一图胜千言&#xff0c;看看吧。 数据表导出 数据配置表导出算是一种无法绕开的基础设施吧。 大致使用 核心模块 项目由2个模块组成&#xff0c;一个是核心模块&#xff0c;另一个是图形化模块。 这里展示的是核心模块中的代码结构。 数据类型的相关截图。 图…

Matlab实现海洋捕食者优化算法优化回声状态网络模型 (MPA-ESN)(附源码)

目录 1.内容介绍 2部分代码 3.实验结果 4.内容获取 1内容介绍 海洋捕食者优化算法&#xff08;Marine Predators Algorithm, MPA&#xff09;是一种基于海洋生物捕食行为的新型群体智能优化算法。MPA通过模拟海洋捕食者如鲨鱼、海豚等在寻找猎物时的追踪、包围和攻击行为&…

图论day57|101.孤岛的总面积(卡码网)【逆向思维】 、102.沉没孤岛(卡码网)、103.水流问题(卡码网)【逆向思维】

图论day57|101.孤岛的总面积(卡码网&#xff09;【逆向思维】 、102.沉没孤岛&#xff08;卡码网&#xff09;、103.水流问题(卡码网&#xff09;【逆向思维】 101.孤岛的总面积(卡码网)102.沉没孤岛&#xff08;卡码网&#xff09;103.水流问题(卡码网)1.常规思维2.逆向思维 1…

从opencv-python入门opencv--GUI功能之图像和视频操作

从opencv-python入门opencv--GUI功能之图像和视频操作 一、文章介绍二、图像的读取显示及保存1、 cv.imread()2、cv.imshow()3、cv.imwrite()4、cv.waitKey()5、cv.destroyAllWindows()6、图像读写存完整示例代码及效果 三、视频读取保存功能1、cv.VideoCapture()&#xff08;1…

SpringBoot项目错误日志打印不容易注意到的坑

文章目录 一、不要使用e.printStackTrace()二、不要使用log.error(e.getMessage())三、不要在日志打印时进行字符串拼接 先说结论&#xff1a;建议使用log.error(String msg, Throwable t)方式打印错误日志&#xff0c;最好在加上try中的各种参数的信息方便排查 Slf4j public …

YARN调度原理详解

YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Hadoop 集群的资源管理和作业调度框架&#xff0c;它的设计旨在更好地管理和调度 Hadoop 集群中的资源。YARN 解决了传统 Hadoop MapReduce 中资源管理与作业调度紧耦合的问题&#xff0c;使得不同类型的计算任…