1、gdb基本功能

文章目录

  • 1、gdb
    • 1.1、运行
      • 1.1.1、程序入参
    • 1.2、断点及观察点
      • 1.2.1、设置断点
      • 1.2.2、禁用、删除断点
      • 1.2.3、观察点
    • 1.3、打印
      • 1.3.1、设定打印参数
      • 1.3.2、打印数据
      • 1.3.3、自动打印
      • 1.3.4、按照地址打印

linux下我现在接触到的常用调试工具如下.

  • gbd
  • gdbgui
  • cmake-tools

  gdb是最为通用的,普遍linux会自带gdb工具,使用简单,无额外需求.

  gdbgui需要额外安装,且会占用处理器资源.

  cmake-tools是使用vscode远程ssh设备时在vscode上安装的一个插件,必须用cmake组织管理代码且使用vscode时才可以使用该工具借助于vscode图形化界面进行debug,但相当占用处理器资源.

下面只介绍gdb具体使用方法.

1、gdb

安装方式.

sudo apt-get install gdb

使用方法

// 无参程序调用
gdb ./<exce>
// 有参程序调用
gdb ./<exce> <param>

exce即为代码编译出来的可执行文件.

正常执行后会出现如下界面.
在这里插入图片描述

注意,这个时候程序并没有开始运行.

如果程序带有入参,则

1.1、运行

运行常用相关指令见下表.

命令简写形式说明
runr开始执行程序直到遇到 结束或者遇到断点等待下一个命令;
startst开始执行程序,在main函数中的第一条语句前停下
continuec继续程序的运行,直到遇到下一个断点
nextn执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句)
steps执行下一条语句,如果该语句为函数调用,则进入函数执行第一条语句
finish直接执行完当前函数,返回到调用该函数的位置
quitq推出gdb调试环境

该部分比较简单,且都比较常用,不再复述.

1.1.1、程序入参

命令简写形式说明
set args 设定运行时的参数
show args查看设定的运行参数

1.2、断点及观察点

gdb支持如下几种断点,且断点可以在程序运行前设置.

  • 普通断点,运行到该处就停止
  • 条件断点,运行到该处后且符合设定条件才停止
  • 临时断点,只生效一次的断点

观察点是运行中设置,而且只能是变量。

1.2.1、设置断点

命令简写形式说明
breakb设置断点
break ifb if条件断点,满足if后的条件后停止
tbreak临时断点,只生效一次

断点有如下几种设置方法.

// 在指定文件的指定行号设定断点
b <file_name>:<file_line>
// 在指定文件的指定函数设定断点
b <file_name>:<fun_name>
// 根据条件设定断点
b <file_name>:<file_line> if <cond>  例如:x==0

临时断点和上述用法一样.

1.2.2、禁用、删除断点

命令简写形式说明
info b显示当前所有断点
d break 删除指定断点
deleted删除所有断点
disable b 禁用指定断点
enable b 使能制定断点

想要禁用或者删除断点,需要先知道当前共有哪些断点.如下所示.

在这里插入图片描述

从左到右,分别是断点号,类型,使能状态,后面是断点具体位置.

禁用断点示例如下.对应的使能断点不在演示.

在这里插入图片描述

可以看到禁用断点2后,后面的Enb变为了n.代表断点被禁用不生效,但依旧存在.

使能断点,删除所有断点如下所示.
在这里插入图片描述

删除指定断点示例如下.

在这里插入图片描述

1.2.3、观察点

观察点是当变量变化即停止的一种调试手段.

命令简写形式说明
info b利用此方式也可以查看watch信息,也可以使用info watch在这里插入图片描述
watch 只有当被监控变量(表达式)的值发生改变,程序才会停止运行
rwatch 只要程序中出现读取目标变量(表达式)的值的操作,程序就会停止运行
awatch 只要程序中出现读取目标变量(表达式)的值或者改变值的操作,程序就会停止运行

cond可以是变量也可以是表达式.

我只用过变量.以变量说明

struct test{char name[16];uint32_t age;
};
struct test data = {0};
struct *p = &test_data;
  • watch data 当data里任意一个数据发生改变即刻停止

  • watch data.age 当data内的age发生改变时停止

  • watch *pwatch data

  • watch p 当p指向内容发生变化时即刻停止

watch设定观察点的方式有两种,默认为1.

  • 硬件观察点
  • 软件观察点

以RK3568举例,实际使用中发现最多只能建立2个硬件观察点,后续在使用watch后,会出现如下提示.

Hardware watchpoint num: Could not insert watchpoint

使用如下指令强制GDB调试器建立软件观察点.

set can-use-hw-watchpoints 0

awatch 和 rwatch 命令只能设置硬件观察点,如果系统不支持或者借助如上命令禁用,则 GDB 调试器会打印如下信息:

Expression cannot be implemented with read/access watchpoint.

备注:软件观察点会导致程序执行效率变低

1.3、打印

1.3.1、设定打印参数

命令简写形式说明
set print elements 设定打印长度
show print elements显示打印长度
set print pretty on打开换行打印

打印信息过长时,信息显示不全,可以使用set print elements进行设定显示长度.

打印结构体时,默认不换行,使用set print pretty on可以将结构体成员变量换行显示如下所示.

其中红框内的是默认打印方式,下面的是打开换行打印后的显示效果.

在这里插入图片描述

1.3.2、打印数据

命令简写形式说明
print/p打印数据
ptype <var_name>查看变量数据类型

简单介绍如下几种简单的使用方式.

int a = 1;
int *p_a = &a;
char name[32] = "name";p a   打印变量a值
p p_a  打印p_a存储的地址,即a的地址
p *p_a  打印p_a存储地址的所存储的数据
p name  打印name中的字符串值
p name[<idx>]@<len>  打印数组name从idx索引处len长度的数据
p ++a  打印++a的值,此时程序内a的值也将发生变化
p <fun(<param>)> 将参数传入函数中,直接调用函数并打印返回值

如果想要数据按照指定的方式打印,则需要用到参数.参数常用值

fmt功能
/x十六进制的形式打印
/d有符号,十进制形式打印证书
/u无符号,十进制形式打印证书
/o八进制打印
/t二进制打印
/f浮点数打印
/c字符打印
/s字符串打印

如下所示.

p/x a             以十六进制形式打印a变量
p/s name		  以字符串形式打印name数组存储的数据
p/x name[0]@10    以十六进制形式挨个打印name数组从0到len-1索引的数据

如果当前断点在C文件,此时想查看A文件的非局部变量的值,可以通过如下方式.

p <file_name>::<var_name>

可通过下列命令打印变量的类型

ptype <var_name>

1.3.3、自动打印

上述print指令需要用户每次都输入才会执行打印功能.如果想要程序一停止就打印数据可以使用display功能.

命令简写形式说明
display
info display查看自动显示的信息,包含信息编号
disable display 失能自动输出,num代表信息编号
num可以为多个,比如disable display 2 3 4
也可以为一个范围,比如disable display 2-4
enable display 使能自动输出,num代表信息编号
num可以为多个,比如enable display 2 3 4
也可以为一个范围,比如enable display 2-4
delete display d display 删除输出, num代表信息编号,同undisplay <num>
num可以为多个,比如disable display 2 3 4
也可以为一个范围,比如disable display 2-4

display所有用法同print基本一致.

1.3.4、按照地址打印

命令简写形式说明
x/<n/f/u> 按照nfu三个参数的配置打印addr出的数据

其中,n、f、u的含义如下.

名称含义
n正整数,从addr开始,打印n个长度的数据
f打印形式,o是8进制,u是无符号10进制,t是二进制,c是字符,s是字符串等,参考print打印形式
u表示从当前地址往后请求的字节数,即一个长度的单位,默认为4字节,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。

x/16xb: 打印0地址处16个长度单位的数据,每个单位长度为一个字节,共计16个字节数据以16形式打印.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/586533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+vue高校体育器材管理信息系统5us4g

优秀的高校体育馆场地预订系统能够更有效管理体育馆场地预订业务规范&#xff0c;帮助管理者更加有效管理场地的使用&#xff0c;有效提高场地使用效率&#xff0c;可以帮助提高克服人工管理带来的错误等不利因素&#xff0c;所以一个优秀的高校体育馆场地预订系统能够带来很大…

霹雳吧啦Wz《pytorch图像分类》-p2AlexNet网络

《pytorch图像分类》p2AlexNet网络基础及代码 一、零碎知识点1.过拟合2.使用dropout后的正向传播3.正则化regularization4.代码中所用的知识点 二、总体架构分析1.ReLU激活函数2.手算3.模型代码 三、训练花分类课程代码1.model.py2.train.py3.predict.py 一、零碎知识点 1.过拟…

Java多线程<三>常见的多线程设计模式

多线程的设计模式 两阶段线程终止 park方法 interrupted() 会让他失效。 使用volatile关键字进行改写 单例模式 双锁检测 保护性暂停 实现1&#xff1a; package threadBase.model;/*** author: Zekun Fu* date: 2022/5/29 19:01* Description:* 保护性暂停&#xff0c;* …

打砖块,Android休闲小游戏开发

A. 项目描述 《打砖块》是一款经典的休闲小游戏 &#xff0c;结合了经典的图形和音效&#xff0c;给玩家带来了轻松愉快的游戏体验。 该游戏操作简单易上手。玩家只需通过触摸屏幕控制底部的“拍子”左右移动&#xff0c;以反弹“小球” 击碎 顶部的砖块。玩家可以根据球的角度…

基于JAVA+SSM+VUE的前后端分离的大学竞赛管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着互联网技术的快速…

青龙面板的安装

一、安装docker 首先&#xff0c;需要在服务器上安装docker。 没有服务器的可以使用虚拟机&#xff0c;或申请一台三丰云的免费云服务器体验一下&#xff0c;独立IP地址&#xff0c;送免备案服务&#xff0c;可以满足基本的使用&#xff0c;三丰云上还有免费虚拟主机等其他免费…

ES6之解构赋值详解

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

Springboot整合MybatisPlus的基本CRUD

目录 前言1. 搭建项目2. 基本的CRUD 前言 发现项目框架是MybatisPlus的&#xff0c;由于个人使用该框架的CRUD比较少 对此学习过程中&#xff0c;从零到有开始搭建学习还是比较重要的&#xff0c;感悟会比较多 关于各个类的使用&#xff0c;可看如下文章&#xff1a; 剖析Ja…

Java—AOP案例-记录操作日志

简介&#xff1a;上一篇文章“JAVA语言—AOP基础”已经详细的介绍了AOP的各个功能接口&#xff0c;已经使用步骤&#xff0c;这篇文章就是基于此来做的一个小案例。案例的功能是记录登录的用户对于数据库表的相关信息进行增、删、查、改的操作记录下来&#xff0c;并且存储到数…

腾讯云轻量应用服务器详细介绍(全网超详细说明)

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

微信小程序开发系列-08自定义组件模版特性

微信小程序开发系列目录 《微信小程序开发系列-01创建一个最小的小程序项目》《微信小程序开发系列-02注册小程序》《微信小程序开发系列-03全局配置中的“window”和“tabBar”》《微信小程序开发系列-04获取用户图像和昵称》《微信小程序开发系列-05登录小程序》《微信小程序…

点成案例 | 如何利用细胞计数仪在单细胞测序中评估细胞

一、概述 单细胞测序技术能够用来表征异常细胞群&#xff0c;分析稀有细胞和细胞图谱网络&#xff0c;发现异质性等。由于单细胞测序巨大的应用潜力&#xff0c;目前此技术正在经历爆炸性增长。然而&#xff0c;单细胞测序需要成本和时间的大量投资。为了确保时间和资源的投资…

正确的认识 字节码文件

上一篇中认识了JVM的基本组成&#xff0c;我们说JVM只认识字节码文件。那么在字节码文件进入JVM之前&#xff0c;我们先认识了解字节码文件长什么样&#xff0c;我们作为工程师不需要去死扣底层的理论知识&#xff0c;但是我们只是需要正确的打开字节码文件 知道里面有哪些部分…

[Angular] 笔记 22:ElementRef

chatgpt: ElementRef 是 Angular 中的一个类&#xff0c;它用于包装对 DOM 元素的引用。它允许开发者直接访问与 Angular 组件关联的宿主 DOM 元素。 当在 Angular 中需要直接操作 DOM 元素时&#xff0c;可以使用 ElementRef。通常情况下&#xff0c;最好避免直接操作 DOM&a…

Prism介绍

Prism介绍 Prism是一个框架&#xff0c;用于在WPF、Xamarin Forms、Uno Platform和WinUI中构建松散耦合、可维护和可测试的XAML应用程序。 设计目标 为了实现下列目的&#xff1a; 创建能够由模块组成的程序&#xff0c;这些模块能够被单独地编写、组装、部署&#xff0c;并且对…

十三:爬虫-Scrapy框架(下)

一&#xff1a;各文件的使用回顾 1.items的使用 items 文件主要用于定义储存爬取到的数据的数据结构&#xff0c;方便在爬虫和 Item Pipeline 之间传递数据。 items.pyimport scrapyclass TencentItem(scrapy.Item):# define the fields for your item here like:title scr…

jmeter函数助手-常用汇总

一.函数助手介绍 1.介绍及作用 介绍&#xff1a; jmeter自带的一个特性&#xff0c;可以通过指定的函数规则创建后进行调用该函数&#xff0c;在后续接口请求参数中进行调用 作用 &#xff08;1&#xff09;做参数化。 2.如何使用 jmeter工具栏-->工具-->函数助手…

LabVIEW在大型风电机组状态监测系统开发中的应用

LabVIEW在大型风电机组状态监测系统开发中的应用 风电作为一种清洁能源&#xff0c;近年来在全球范围内得到了广泛研究和开发。特别是大型风力发电机组&#xff0c;由于其常常位于边远地区如近海、戈壁、草原等&#xff0c;面临着恶劣自然环境和复杂设备运维挑战。为了提高风电…

DockerCompose - 容器编排、模板命令、compose命令、Pottainer 可视化界面管理(一文通关)

目录 一、DockerCompose 容器编排 1.1、简介 1.2、Docker-Compose 安装 1.2.1、在线安装 1.2.2、离线安装 1.3、docker-compose.yml 中的模板命令 前置说明 模板命令 1.4、DockerCompse 命令 前置说明 up down exec ps restart rm top pause暂停 和 unpause恢…

linux下的进程布局与ububtu操作系统下的proc文件夹学习笔记一

相关内容我写在公众号&#xff0c;写的挺详细的&#xff0c;欢迎关注我的公众号。请使用鼠标右键&#xff0c;新建标签页打开&#xff0c;直接点击显示参数错误&#xff0c;不知道怎么回事&#xff1f;linux下的进程布局与ububtu操作系统下的proc文件夹学习笔记 (qq.com)https:…