【Linux】调试器——gdb使用

目录

一、预备知识

二、常用指令

三、调试技巧

(一)监视变量的变化指令 watch

(二)更改指定变量的值 set var


正文

一、预备知识

程序的发布形式有两种,debug和release模式,Linux gcc/g++出来的二进制程序默认是release模式。

要使用gdb调试,必须在源代码生成二进制程序的时候加上-g 选项,如果没有程序无法编译。

gdb还有个不友好的点是调试时无法直接看到源码,所以使用cgdb调试器。


以下是调试中用到的代码,先创建一个mycmd.c文件将下面代码写入,gcc mycmd.c -o mycmd生成可执行文件然后开启我们的调试之旅

二、常用指令

(1)进入cgdb 调试界面

cgdb 文件名:cgdb mycmd

(2)显示源代码:list/l

list/l: 显示源代码

list/l 函数名: 列出指定函数的源代码 list/l main

list/l 文件名:行号 : 列出指定文件的源代码 list/l mycmd.c:1

(3)退出指令:quit

(4)打断点指令:break/b

break/b 行号: 在指定行设置断点,该行数会有高亮提醒,对应VS调试中的F9操作

(5)查看断点指令: info b/break

info b:查看所有断点信息,前面的1、2...数字表示断点的个数编号,编号根据打断点次数依次递增不受删除断点影响

(6)删除断点指令:delete/d

d 断点编号:删除断点必须通过编号删除,要知道编号得先执行查看获取

删除第2编号断点,再次查看已没编号2

(7)删除所有断点指令:delete/d breakpoints

(8)从程序开始连续执行指令:run/r

第一:gdb启动调试时只是开启了gdb,程序并没有被调试起来必须输入r

第二:run/r表示在gdb场景中启动我们的程序mycmd

第三:在没打任何断点的情况下run/r从头开始执行程序

第四:有断点run/r执行程序时跳到第一个断点处开始执行

(9)逐过程调试指令:n/next

单步执行,不进入函数内部,对应VS调试中的F10

(10)逐语句调试指令:s/step

单步执行,进入函数内部,对应VS调试中的F11

(11)跟踪变量值的指令:display 变量名

在循环过程中想观察变量的数值变化可以使用此语句,display后最前面的数字表示变量编号,对应VS调试中的监视窗口

(12)取消变量值跟踪指令:undisplay 编号

需要通过变量编号删除

(13)执行到指定行号指令:until 目标行号

如果在调试过程中循环语句要执行100次,而你又确定报错一定不在循环中,可以until+目标行号,直接执行完循环到指定行处

(14)运行到下一个断点处指令:continue/c

运行到下一个断点处或直接运行结束

(15)查看当前栈各级函数调用及参数:bt

程序执行到函数时会向栈申请空间,这句代码旨在查看当前执行到这堆栈被调用情况,以下代码只有一个sum函数。

对应VS调试中的堆栈调用监视窗口

(16)查看当前栈帧的局部变量值:info i

也就是当前在debug下的程序信息

(17)禁用所有断点指令:disable breakpoints

为什么禁用断点而不直接删除:调试过程中你可能没有发现问题,并且程序还跑得过去可当你关闭调试,执行代码时程序又报错,如果你直接删除断点无法在之前的调试基础上再次调试,所以禁用断点是为了保留调试痕迹。

没被禁用的断点在查看时Enb下显示y:

disable breakpoints禁用所有断点后Enb下显示n:

(18)启用所有断点指令:enable breakpoints

以上的18点调试技巧足以让我们进行代码调试,有兴趣的同学可以继续了解更多其他调试语句~

三、调试技巧

(一)监视变量的变化指令:watch

在整个程序中你有定义一些静态变量或者一些不应该修改的变量,但你怀疑它修改了导致程序报错,你可以watch它,如果这个变量在运行过程中变了就会通知你

所以断点的类型除了breakpoint 还有watchpoint的形式

(二)更改指定变量的值:set var

指的是在调试中你怀疑导致代码出错的是某个原本不可变变量值,而你此时只是猜测不想直接动源代码改值,可以使用set var更改变量值看是否还报错。


以上是gdb的基础调试语句,看到这希望对你有帮助。

相关推荐
孞㐑¥1 小时前
Linux之权限问题
linux·经验分享·笔记
sakabu1 小时前
基于Linux C语言多线程服务器+Qt客户端+STM32客户端实现的无人超市项目
linux·服务器·c语言·stm32·单片机·qt·stm32项目
DjangoJason1 小时前
操作系统 :进程概念
linux·笔记·ubuntu
dessler2 小时前
Kubernetes(k8s)-隔离(Cordon)和驱逐(Drain)
linux·运维·kubernetes
浩浩测试一下2 小时前
网络安全之超强Linux信息收集:渗透测试与应急响应的基石(命令超强集合工作手册)
linux·运维·服务器·安全·web安全·网络安全·系统安全
GISer_Jing2 小时前
前端常问的宏观“大”问题详解(二)
linux·前端·ubuntu
带鱼吃猫2 小时前
Linux系统:进程状态与僵尸、孤儿进程
linux·服务器
郝晨妤3 小时前
【鸿蒙5.0】向用户申请麦克风授权
linux·服务器·前端·华为·harmonyos·鸿蒙
头发尚存的猿小二3 小时前
Linux--文件
linux·运维·服务器
榆榆欸4 小时前
5.实现 Channel 类,Reactor 模式初步形成
linux·网络·c++·tcp/ip