Linux调试器-gdb使用

发布于:2024-10-13 ⋅ 阅读:(7) ⋅ 点赞:(0)

目录

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