Linux中的C/C++语言调试工具 GDB

news2025/1/11 7:51:03

Linux中的C/C++语言调试工具 GDB

GDB(GNU Debugger)是一个功能强大的调试器,用于调试和分析程序的执行过程。它是GNU项目的一部分,可以在多个操作系统上使用,包括Linux、Unix和Windows。

GDB主要用于调试编译后的可执行文件,它可以帮助程序开发人员识别和修复代码中的错误、追踪程序的执行流程、观察和修改程序的状态,以及分析程序崩溃时的堆栈跟踪信息。

Linux下最常用的调试工具就是GDB。

目录

  • Linux中的C/C++语言调试工具 GDB
    • 1.安装GDB
    • 2.使用GDB
      • 2.1启动与退出
      • 2.2装入调试程序
      • 2.3列出源代码
      • 2.4执行程序
    • 3.设置与管理断点
      • 3.1 设置断点
      • 3.2查看断点信息
      • 3.3删除断点信息
      • 3.4设置观察点
    • 4.显示数据和修改变量值
      • 4.1显示变量或表达式的值
      • 4.2 自动显示变量或表达式的值
      • 4.3修改变量的值
    • 5.执行命令和调用函数
      • 5.1单步执行
      • 5.2退出被调用的函数
    • 6.其他
      • 6.1帮助手册
      • 6.2 查看堆栈信息
      • 6.3 查看程序的汇编代码

1.安装GDB

sudo apt-get install gdb

2.使用GDB

2.1启动与退出

启动

$gdb

使用quit命令(简写成q)退出

$(gdb)q

2.2装入调试程序

首先写一个C语言程序

/*a.c*/
#include<stdio.h>
void show(int i){
	printf("this is %d\n",i);
}
int main(){
	int i=0;
	int j=9;
	for(i=1;i<=j;i++)
		show(i);
	return 0;
}

对上面的代码进行编译连接

gcc -g a.c -o a

在调试程序之前必须先得在gdb中装入调试程序,根据装入调试程序的时间分为两种:

  • 在启动gdb时,进行装入:

    $gdb a
    
  • 在启动gdb之后,进行装入:

    (gdb) file a
    

请添加图片描述

2.3列出源代码

程序转入gdb之后,可以使用list命令(可以简写成l)将源码列出。

(gdb) list

请添加图片描述

默认情况下只会显示前10行的代码,如果程序代码量过多,可以继续使用list命令显示后面的代码。

2.4执行程序

执行命令时run(可以简写成r)。可以在run命令之后可以加入执行参数来执行相关的操作。

(gdb) run

请添加图片描述

目前没有添加断点,所以程序直接输出了运行结果。若添加了断点,则会在断点的位置进行停止。

3.设置与管理断点

3.1 设置断点

设置断点的命令是 break(可以简写成b)。一般设置形式:

break 行号

设置完断点以后,利用run命令执行程序。

请添加图片描述

  • 利用break设置断点时,也可以添加条件进行判断

    break 行号 if语句
    

当程序在断点处停下来了,可以使用continue命令(可以简写成c),继续执行程序。

(gdb) continue

请添加图片描述

3.2查看断点信息

加入断点之后,可以利用 info break命令进行查看设置的断点信息。可以看到在断点的编号、类型、地址等信息。

(gdb) info break

请添加图片描述

3.3删除断点信息

利用delete命令(可以简写成d)进行删除之前设置的断点。

delete 断点编号

删除指定范围内的断点也可以使用

delete 起始断点编号-终点断点编号

也可以删除指定行上的断点,利用clear命令进行删除

(gdb) clear 行号

请添加图片描述

3.4设置观察点

观察点也称数据断点,顾名思义就是用来观察某个变量或者表达式的变化,如果有变化,则暂停程序的运行,这在调试程序中时非常常见的。设置观察点的命令为 watch,后面跟变量过着表达式。·

(gdb) watch 变量或表达式

可以利用info watchpoints命令来查看当前设置的所有观察点。

可以使用delete命令来删除指定的观察点。

请添加图片描述

4.显示数据和修改变量值

4.1显示变量或表达式的值

在调试程序的过程中,查看变量或则表达式的值是一个有效的方法。

在GDB中,可以用print命令(可以简写成p)来显示。

(gdb) print 变量或表达式

请添加图片描述

4.2 自动显示变量或表达式的值

若我们需要持续性观察一个变量或表达式的值,可以使用display命令,设置为自动显示。

(gdb) dispaly 变量

请添加图片描述

4.3修改变量的值

在调试程序中,我们可以通过修改某一个变量的值来验证代码的准确性。

set命令

(gdb) set 变量=值

5.执行命令和调用函数

为了方便后面的演示,现在新建一个b.c代码文件。

/*b.c*/
#include<stdio.h>
void show(){
	printf("1+2+3= ");
}
int main(){
	int i=0;
	int sum=0;
	for(i;i<=3;i++)
		sum+=i;
	show();
	printf("%d\n",sum);
	return 0;
}

编译成可执行文件,并载入gdb中,方便后续演示。

$gcc -g b.c -o b
$gdb b

5.1单步执行

单步执行就是一步一步跟踪程序的执行的流程,根据变量的值,找到错误的原因。这是在程序调用中的常见的操作。

GDB中可以使用step(可以简写成s)或next(可以简写成n)来单步执行程序。

step命令可以跟踪进入函数内部;next命令会将函数看作一条语句,不进入函数内部。

请添加图片描述请添加图片描述

5.2退出被调用的函数

当利用step命令进入函数内部时,如果需要忽略剩下的函数语句,并继续向下执行,可以执行return命令跳出函数,

return命令后面可以跟变量或表达式。

6.其他

6.1帮助手册

GDB中设置了帮助手册,不清楚的命令可以利用help来获取帮助。

请添加图片描述

6.2 查看堆栈信息

利用backtrack(可以简写成bt)和frame(可以简写f)命令查看栈的信息。

请添加图片描述

6.3 查看程序的汇编代码

可以利用disassemble命令来显示程序的汇编代码。

void show(){
	printf("1+2+3= ");
}

请添加图片描述

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

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

相关文章

大模型扎堆「赶考」,语文还是国产AI行,文言文能力超过95%考生

量子位 | 公众号 QbitAI ChatGPT诞生后的第一场全国高考&#xff0c;考生忙&#xff0c;大模型们也很忙。 这不&#xff0c;高考还没结束&#xff0c;AI挑战高考题就成了刷屏热搜话题&#xff0c;各家大模型都被拉出来写起了高考作文&#xff0c;甚至是参与整场考试。 &#…

【MySQL事务】保证数据完整性的利器

1、事务的认识 事务&#xff1a;事务就是将多个SQL给打包在一起&#xff0c;组成一个整体。组成这个整体的各个SQL&#xff0c;要么全部成功&#xff0c;要么全部失败。 举例说明&#xff1a; 情人节到了&#xff0c;滑稽老铁打算给他女朋友小美发给红包&#xff0c;但是他又害…

msvcp140.dll重新安装的解决方法(一键安装方法)

msvcp140.dll电脑文件中的dll文件&#xff0c;即动态链接库文件&#xff0c;若计算机中丢失了某个dll文件&#xff0c;就会导致某些软件和游戏等程序无法正常启动运行&#xff0c;并且导致电脑系统弹窗报错&#xff0c;其安装方法&#xff1a;1、打开浏览器输入“【dll修复程序…

[Diffusion] Speed is all your need

论文简要总结 刚读了下speed is all you need这个论文, https://arxiv.org/pdf/2304.11267.pdf 只是用的SD1.4没有对网络进行改造。 只做了4个改动 1 是对norm采用了groupnorm (GPU shader加速) 2 采用了GELU (GPU shader加速) 3 采用了两种attention优化&#xff0c;是partiti…

一个简单的MCU内存管理模块(附源码)

现在非常多的的MCU性能都还不错&#xff0c;同时用户也会去扩展一些外部RAM&#xff0c;那么如何高效便捷的管理这些内存是一个重要话题。 今天给大家分享一份源码&#xff1a;基于无操作系统的STM32单片机开发&#xff0c;功能强大&#xff0c;可申请到地址空间连续的不同大小…

如何应对公民开发者的挑战?低代码流程自动化助你打造高效系统

如今&#xff0c;企业越来越倾向于采用公民开发作为提升流程自动化和数字化转型的手段。这种方法让非程序员&#xff08;如客户和员工&#xff09;&#xff0c;有机会为特定任务创建自己的应用程序。它还使公司能够快速调整以适应客户偏好或业务需求。 尽管这种方法有很多好处&…

Prometheus+Grafana普罗米修斯搭建+监控MySQL

PrometheusGrafana普罗米修斯搭建监控MySQL 一&#xff0c;Prometheus 1.什么是Prometheus&#xff1f; ​ Prometheus 是 Cloud Native Computing Foundation 的一个监控系统项目, 集采集、监控、报警等特点于一体。 ​ Prometheus主要受启发于Google的Brogmon监控系统&…

数字化转型浪潮下,汽车零部件企业如何逐鹿突围?

一、汽车行业当下趋势 数据来源&#xff1a;汽车工业协会 1.乘用车及新能源车市场&#xff1a;2023年1-4月&#xff0c;乘用车销量同比增长6.8%&#xff0c;新能源车销量同比增长35.8%。 2.行业趋势&#xff1a;汽车行业生存压力大&#xff0c;4月中国汽车经销商库存系数下降…

中国科学院稀土研究院-PLC采集项目案例

1.项目背景 中国科学院稀土研究院&#xff08;江西稀土研究院&#xff09;隶属中国科学院。 作为中国国内唯一专注于稀土科技创新的国立科研机构&#xff0c;中国科学院稀土研究院将面向国家战略和产业发展重大需求&#xff0c;围绕稀土绿色、高效、均衡、高值化利用的核心科学…

【Spring MVC】没有Spring MVC,Spring Boot表现得毫无用处? ? ?走进Spring MVC,学习热部署自动运行程序 ! ! !

前言: 大家好,我是良辰丫,从今天开始,我们就要进入Spring MVC的学习了,前面的文章中我们的很多注解都没有讲解,是不是看的脑瓜嗡嗡的,哈哈,没关系,在我们Spring MVC中我们就要详细讲解那些注解了,请跟随良辰的脚步,gogogo! ! !&#x1f48c;&#x1f48c;&#x1f48c; &#x…

希望之星、黄昏之星、三只乌鸦……怎么用 DolphinDB 快速计算 K 线?

K 线技术分析是股票投资中很常用的一种分析方法&#xff0c;主要通过历史价格图表中的数据来预测未来市场趋势。一根 K 线包括四个价格&#xff1a;开盘价、收盘价、最高价和最低价&#xff0c;通常简称为 OHLC。K 线按照周期一般可以分为日、周、月、年&#xff0c;以及五分钟…

Selenium自动化落地实践

01、自动化测试流程图 02、主要过程描述 1、自动化测试的切入点 开展自动化测试的时间点很关键&#xff0c;需要在系统已经过多版本的系统测试&#xff0c;达到稳定之后。 2、可行性分析 在进行项目自动化测试之前&#xff0c;第一步就是要确认其可行性&#xff0c;是否可以…

为何唐宋诗词鼎盛,而到了明清变成了小说

我国是一个历史悠久的国家&#xff0c;在漫长的历史长河中&#xff0c;随着朝代的更替&#xff0c;很多事也发生了有趣的变化。 例如唐宋时期盛行的是诗词&#xff0c;而到了明清时代&#xff0c;小说又开始盛行了起来&#xff0c;那么造成这种文风改变的原因是什么呢&#xf…

2023安博会进行时!英码科技1个重磅+4大看点隆重亮相

2023年6月7日&#xff0c;第十六届&#xff08;2023&#xff09;中国国际社会公共安全产品博览会&#xff08;以下简称&#xff1a;安博会&#xff09;在北京首钢会展中心盛大开幕&#xff01;本届安博会以“自主创新数智融合”为主题&#xff0c;共设置了7大主题展馆&#xff…

linux开发:Linux下查看端口占用

前段时间有学生问到&#xff0c;怎么查看已经被占用的端口&#xff1f;下面我就统一给大家解释一下。 提到端口&#xff0c;那首先来回顾端口定义&#xff0c;为了区分一台主机接收到的数据包应该转交给哪个任务来进行处理&#xff0c;使用端口号来区别&#xff1b;我们知道TCP…

【活动预告】ACDU 中国行 · 深圳站精彩抢先看

近期活动 在当今数字化时代&#xff0c;数据库是各行各业中最核心的信息管理系统之一。 随着技术的飞速发展&#xff0c;数据库领域也不断涌现出新的前沿技术和创新应用。 数据库运维和开发人员需要紧跟前沿技术&#xff0c;才能保持竞争力&#xff0c;并实现更高效、更智…

Java-API简析_java.lang.Float类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131129886 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

JMeter测试笔记(五):JDBC请求

引言&#xff1a; 进行性能测试时&#xff0c;我们有时需要模拟数据库的访问和操作&#xff0c;而JMeter中的JDBC请求可以帮助我们实现这个目的。 在本文中&#xff0c;我们将深入了解JDBC请求的使用方式&#xff0c;并学习如何正确配置它们来模拟对数据库的访问和操作。 如…

Excel函数VLOOKUP常用方法

一、基础用法 1、精确匹配 公式&#xff1a;VLOOKUP(待匹配值&#xff0c;查找范围&#xff0c;范围列数&#xff0c;查找方式) 定义好要输出表的表头和第一列&#xff0c;第一列即为要查找和匹配的父内容&#xff0c;在第二列输入公式&#xff0c;被查找表中一定也要将待查…

【大数据学习番外篇之爬虫2】爬虫入门简单例子

目录 1. 图片爬取 2. 破解百度翻译 3. 豆瓣电影爬取 4. 肯德基餐厅位置爬取 1. 图片爬取 通过以下代码我们可以看到图片已经爬取进入虚拟机里面。 # -*- coding: utf-8 -*- import re import requests from urllib import error from bs4 import BeautifulSoup import os…