首页 > 其他分享 >gdb的使用

gdb的使用

时间:2023-09-17 14:01:38浏览次数:28  
标签:功能 函数 使用 Add gdb 编号 main 断点

1、背景

  • 程序的发布方式有两种,debug模式和release模式
  • Linux gcc/g++编译出来的二进制程序,默认是release模式
  • 要使用gdb调试,必须在源代码生成二进制程序的时候,加上-g选项

例如gcc test.c -o mybin -g

2、命令功能

gdb binFile(开始使用),ctrl+d或quit(退出)

测试代码:

gdb的使用_指令

调试命令:

GDB中可以直接回车键重复上一次的命令,用pgUp键可以查看历史命令。

(1)list/l 行号 

功能:功能显示binFile源代码,每次显示周围10行。

l指令默认从main函数开始显示:

gdb的使用_Linux下代码调试_02

l 1 显示第一行周围的代码,再用l或者直接回车键键,可以继续查看下面10行代码:

gdb的使用_GDB_03

(2)list/l 函数名

功能:显示出某个函数的源代码。

l mian ,显示出main函数的周围10行的源代码:

gdb的使用_GDB_04

l mul:

gdb的使用_Linux下代码调试_05

(3)break/b 行号

功能:在某一行设置断点。

在25行打上断点:

gdb的使用_Linux下代码调试_06

(4)break/b 函数名

功能:在某个函数开头设置断点。

在Add函数开头设置断点:

gdb的使用_指令_07

也可以用b 函数名:行数,在函数的第任意行打断点,在main函数的第3行打断点:

gdb的使用_GDB_08

在多文件时,也可以b 文件名:函数名:行数打断点,在test.c文件里的Add函数里的第二行打断点:

gdb的使用_GDB_09

(5)info break/i b

功能:查看断点的信息。

会把打的断点的信息显示出来,Num是断点编号,Type是断点的类型,Disp是断点配置,Enb是是否启用断点,Address是断点的地址,What是断点在代码中的位置:

gdb的使用_GDB_10

(6)delete breakpoint/d 断点编号

功能:删除断点编号所代表的断点

删除4号和5号断点:

gdb的使用_GDB_11

如果不加编号,就会删除所有断点:

(7)disable 断点编号

功能:禁用断点。

禁用断点后改断点就不能在使用,Enb也会变成n:

gdb的使用_指令_12

(8)enable 断点编号

功能:启用断点

让断点重新能够使用,Enb变成y:

gdb的使用_GDB_13

(9)run/r

功能:开始调试。

如果没有断点,就会直接运行完程序,打印出运行结果:

gdb的使用_GDB_14

如果有断点,就会在断点出停下,并打印改行代码:

gdb的使用_GDB_15

如果断点被命中,断点信息会多一条breakpoint already hit 1 time:

gdb的使用_GDB_16

(10)continue/c

功能:从当前位置开始连续执行程序。

当我们run开始调试后,遇到断点停止了,此时想要继续往下执行,可以选择continue,他会连续执行程序,如果遇到断点就会停下来,否则直接运行到程序结束:

gdb的使用_Linux下代码调试_17

(11)next/n

功能:主逐过程执行。

不会进入调用的函数,遇到空行会跳过:

gdb的使用_Linux下代码调试_18

(12)step/s

功能:逐语句执行。

会进入调用的函数:

gdb的使用_指令_19

(13)p 变量/表达式

功能:打印变量值或者表达式的值。

gdb的使用_GDB_20

(14)display 变量名

功能:跟踪查看一个变量,每次停下都显示它的值。

跟踪变量旁边的数字是它们的编号:

gdb的使用_GDB_21

(15)undisplay 编号

功能:取消对先前设置的那些变量的跟踪。

gdb的使用_指令_22

(16)until 行号

功能:运行至指定的行

可以用这个命令来跳过不想看的代码:

gdb的使用_Linux下代码调试_23

(17)finish

功能:运行到当前函数结束,然后停下来等待命令。

在第22行断点处停下后,用s指令进入Add函数,在函数内执行finish指令,运行到当前函数结束后,在第22行停止等待命令:

gdb的使用_指令_24

(18)bt

功能:查看调用堆栈。

在main函数里查看调用堆栈就只有main函数,在Add函数里查看调用堆栈,Add就被压到了栈顶:

gdb的使用_Linux下代码调试_25

(19)set var

功能:修改变量的值。

gdb的使用_Linux下代码调试_26

这个指令可以用来控制循环语句里的循环变量,来快速到达自己想要看的循环次数。


完结。。。

如有错误,欢迎指正,谢谢。

标签:功能,函数,使用,Add,gdb,编号,main,断点
From: https://blog.51cto.com/u_15855358/7501749

相关文章

  • gdb相关
    命令                  命令缩写            命令说明setargs                               设置主程序的参数。break                  b              设置断点。run ......
  • vue2 使用tinymce编辑器实现上传图片及粘贴word文本保留格式并粘贴图片自动上传
    下载对应的版本 npminstall@tinymce/[email protected]@5.8.2-S然后在node_modules中找到tinymce把整个文件复制下来粘到public中 在组件页面使用根据自己需求进行注释或添加功能<template><divclass="tinymce-editor"><Editor:......
  • Golang 基础语法的使用
    1packagecustomer23import(4"encoding/json"5"fmt"6"os"7)89typecustomerstruct{10Namestring11Sexstring12Ageint13Phonestring14......
  • mavlink(四)C库接口使用
    1.库文件接口使用1.1.原理发送方发送数据,需要经历组包->格式转换->发包(根据链路类型调用相关发送接口)的过程;接收方接收数据,需要经历解包->msgId解析->具体消息处理的过程;1.2.接口需要关注的重点是发送数据,接收数据的流程。Mavlink提供了几类接口,简化了应用层收发数据的操......
  • 11.虚拟桌面基础设施: 使用OpenStack的Horizon模块,创建一个虚拟桌面基础设施,允许用户
    使用OpenStack的Horizon模块创建虚拟桌面基础设施可以让用户访问虚拟桌面环境,这通常使用VNC或其他远程桌面协议来实现。Horizon是OpenStack的Web管理界面,用于管理和监控OpenStack云资源。以下是一个简化的示例,演示如何使用Horizon来构建这样一个虚拟桌面基础设施。注意:为了构建这......
  • 如何使用 jest 测试使用 axios 的 httpClient?
    要使用Jest测试使用axios的httpClient,您可以使用Jest提供的模拟功能来伪造对外部API的请求和响应。下面是一个示例测试的代码:首先,安装所需的依赖:npminstallaxiosaxios-mock-adapterjest--save-dev然后,创建一个名为httpService.test.js的测试文件,编写以下代码:importaxiosfrom......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • shell命令概述 Shell作用:命令解释器 介于操作系统内核与用户之间,负责解释命令行 获得
    shell命令概述Shell作用:命令解释器介于操作系统内核与用户之间,负责解释命令行获得命令帮助内部命令help命令的“--help”选项使用man命令阅读手册页命令行编辑的几个辅助操作Tab键:自动补齐反斜杠“\”:强制换行快捷键Ctrl+U:清空至行首快捷键Ctrl+K:清空至行尾快捷键Ctr......
  • C# Record类使用 注解Attribute JsonConverter
    用Record类的时候,声明成员很方便,但是想要用注解,要用下面这种方式: 和这种方式相同:JsonConverter使用需要创建一个class继承与JsonConverter<T>classJsonDoubleCvt:JsonConverter<double>{publicoverridedoubleRead(refUtf8JsonReaderreader,Typet......