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形式打印.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SLAM学习入门--传统图像处理

文章目录 传统图像处理颜色空间高斯滤波腐蚀和膨胀开运算和闭运算如何求一张图片的均值&#xff1f;线性插值双线性插值仿射变换透视变换常见的边缘检测算子Sobel 算法Canny 算法Hough 变换原理&#xff08;直线和圆检测&#xff09;找轮廓&#xff08;findCountours&#xff0…

【网络安全 | Misc】Aesop_secret(ISCC)

正文 动态gif&#xff0c;使用工具进行分解&#xff1a; https://tu.sioe.cn/gj/fenjie/ 得到ISCC字样 由Winhex看到密文&#xff1a; U2FsdGVkX19QwGkcgD0fTjZxgijRzQOGbCWALh4sRDec2w6xsY/ux53Vuj/AMZBDJ87qyZL5kAf1fmAH4Oe13Iu435bfRBuZgHpnRjTBn5xsDHONiR3t0Oa8yG/tOKJMN…

故障诊断模型 | Maltab实现PSO-BP粒子群算法优化BP神经网络的故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现PSO-BP粒子群算法优化BP神经网络的故障诊断 模型描述 在机器学习领域,我们常常需要通过训练数据来学习一个函数模型,以便在未知的数据上进行预测或分类。传统的神经网络模型需…

【大模型的前世今生】从自然语言处理说起

自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;被誉为人工智能皇冠上的明珠&#xff0c;是计算机科学和人工智能领域的一个重要方向。它主要研究人与计算机之间&#xff0c;使用自然语言进行有效通信的各种理论和方法。简单来说&#xf…

基于 CefSharp 实现一个文件小工具

I’m not saying you can’t be financially successful I’m saying have a greater purpose in life well beyond the pursuit of financial success Your soul is screaming for you to answer your true calling You can change today if you redefine what success is to …

网络安全—认证技术

文章目录 加密认证对称密钥体制公钥密码体制公钥的加密公钥身份认证和加密 鉴别码认证MAC鉴别码 报文摘要认证认证 加密只认证数字签名 通过了解以前前辈们使用的消息认证慢慢渐进到现代的完整的认证体系。所以在学习的时候也很蒙圈&#xff0c;因为前期的很多技术都是有很严重…

matplotlib单变量和双变量可视化

使用seaborn 库的tips数据集&#xff0c;其中包含了某餐厅服务员收集的顾客付小费的相关数据&#xff08;评论区&#xff09; 单变量可视化 直方图 直方图是观察单个变量最常用的方法。这些值是经过"装箱"&#xff08;bin&#xff09;处理的 直方图会将数据分组后绘…

Vlan的封装模式和端口讲解(Access、Trunk、Hypbrid端口)

目录 Vlan的封装模式 ISL协议 802.1Q协议 二层接口类型 Access接口 Trunk接口 Hybrid接口 不同Vlan之间的通信 Vlan的作用&#xff08;Vlan工作于OSI参考模型的第二层&#xff09; Vlan&#xff08;Virtual Local Area Network&#xff09;虚拟局域网&#xff0c;将一个…

格密码基础:子格,q-ary垂直格与线性代数

目录 一.写在前面 二.子空间垂直 2.1 理论解释 2.2 举例分析 三. 零空间 3.1 零空间与q-ary垂直格 3.2 零空间与行/列空间 四. 格密码相关 一.写在前面 格密码中的很多基础原语都来自于线性代数的基本概念&#xff0c;比如举几个例子&#xff1a; 格密码中的非满秩格…

年底离职了?2024普通人失业怎么创业?2024创业风口!

有多少人会在12月份离职&#xff1f;这是近期热门的话题&#xff0c;年底了&#xff0c;离职潮也来了。是工作压力大?是跟同事相处不好&#xff1f;是公司发展没前景&#xff1f;不&#xff0c;统统都不是。离职无外乎一个原因&#xff1a;工资低&#xff01; 我们除了打工还…

Mybatis 事务接口

当我们从数据源中得到一个可用的数据库连接之后&#xff0c;就可以开启一个数据库事务了&#xff0c;事务成功开启之后&#xff0c;我们才能修改数据库中的数据。 在修改完成之后&#xff0c;我们需要提交事务&#xff0c;完成整个事务内的全部修改操作&#xff0c;如果修改过…

分库分表之Mycat应用学习二

3 Mycat 概念与配置 官网 http://www.mycat.io/ Mycat 概要介绍 https://github.com/MyCATApache/Mycat-Server 入门指南 https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%973.1 Mycat 介绍与核心概念 3.1.1 基本介绍 历史&#x…

Tomcat和Servlet

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Tomcat是什么&#xff1f;1.1下载&#xff1a;1.2 tomcat是什么1.3启动服务器&#xff1a; 二.部署三、Servlet3.1创建项目3.2引入依赖pom.xml的所有代码 3…

一文讲清数据资产化之确权和估值

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

磁盘管理-------RAID卡

目录 一、RAID概述 二、常见类型 &#xff08;一&#xff09;RAID 0 &#xff08;二&#xff09;RAID 1 &#xff08;三&#xff09;RAID 5 &#xff08;四&#xff09;RAID 6 &#xff08;五&#xff09;RAID 10 &#xff08;六&#xff09;总结 三、创建RAID &…

lambda函数

文章目录 定义捕捉列表的形式一些更复杂的捕捉列表组合代码演示演示一演示二演示三演示四演示五演示六 lambda 函数&#xff0c;是C11中新引入的函数式编程语法&#xff0c;lambda函数可以被定义在类中成员函数内部&#xff0c;全局函数的内部。它是一个局部函数&#xff08;即…

springboot定时执行某个任务

springboot定时执行某个任务 要定时执行的方法加上Schedule注解 括号内跟 cron表达式 “ 30 15 10 * * &#xff1f;” 代表秒 分 时 日 月 周几 启动类上加上EnableScheduling 注释

第二部分 离散型随机变量

目录 求分布律里的未知数 例1 例2 根据X的分布律写Y的分布律 例3 根据(X,Y)的分布律写Z的分布律 例4 根据(X,Y)的分布律写边缘分布律 例5 X与Y相互独立时的联合分布律 例6 根据分布律求期望、方差 例7 求分布律里的未知数 例1 已知X的分布律为 X-202P0.40.3k ,试求k 解 0.40…

【网络奇遇记】揭秘计算机网络的性能指标:时延带宽积|往返时间|利用率|丢包率

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;上期回顾一. 时延带宽积二. 往返时间三. 利用率四. 丢包率&#x1f4dd;结语 &#x1…