【Linux系统化学习】开发工具——gdb(调试器)

news2024/11/25 7:14:49

=========================================================================

个人主页点击直达:小白不是程序媛

Linux专栏:Linux系统化学习

个人仓库:Gitee

=========================================================================

目录

前言:

gdb版本检查和安装

Debug和Release

gdb的使用

其他指令


前言:

前几篇文章分别介绍了在Linux下的代码编辑器、编译器。在编写代码时难免会遇到一些Bug需要我们手动去调试我们的代码片段,在Windows系统下的集成化开发环境我们可能使用某个快捷键就可以进入调试,但是在没有可视化图标的Linux下我们要使用我们的调试器gdb进行调试。


gdb版本检查和安装

版本检查

通过指令判断你的版本和是否安装gdb

  • gdb --version 

安装

  • yum install -y gdb 

 


Debug和Release

我们知道我们编写的代码会有Debug和Release两个版本;Debug版本是我们程序员在实现某一个项目时使用的版本,可以进行各种调试;而Release版本时我们项目完成后,用户使用项目时的版本,不可以调试并且系统会做优化

Windows下的集成开发环境默认为Debug版本,而在Linux下默认为Relase版本。

如何证明在Linux下默认为Release版本呢?

  • 通过能否调试判断为Debug还是Release,Debug可以调试Release不可以调试。
  1 #include<stdio.h>
  2 int Sum(int n)
  3 {
  4     int i=0;
  5     int sum=0;
  6     for(i=1;i<=n;i++)
  7     {
  8         sum+=i;
  9     }
 10     return sum;
 11 }
 12 int main()
 13 {
 14     int n=100;
 15     int ret=Sum(n);
 16     printf("%d \n",ret);                                                                                                                             
 17     return 0;
 18 }

我们在Linux下编写这样一段代码进行测试。

 

  • 通过判断可执行程序的大小判断; Debug系统没有优化比较大,Release系统优化比较小;

 因为Debug版本会添加调试信息,所以Debug版本文件会比Release版本大。

通过查看Debug版本和Release版本的文件信息判断,上面说到Debug版本会添加调试信息;而Linux我们的可执行程序是ELF格式,我们可以通过这一点配合查询和管道在我们的Debug版本下查找是否有Debug的内容。

 


gdb的使用

  • gdb [可执行程序文件名]   
  • 退出: ctrl + d 或 quit 调试命令

  • l 行号/函数名:从指定行号/函数开始打印10行 (不是输入行号/函数名从默认位置打印10行

  • break(b):打断点

 

  • info break :查看断点信息

  • disable:关闭断点
  • enable:启用断点

 

  • c :跳转到下个断点

 

  •  d 断点编号:删除断点(不可以通过行号删除)

  • r :运行程序

  • s :逐语句执行
  • n:逐过程执行

  • finish :运行至当前函数结尾

其他指令

  • diaplay [变量名]:追踪查看变量,显示变量所有信息 
  • undisplby [变量名]:取消追踪
  • until 行号:跳转到X行
  • bt :调用堆栈
  • break 函数名:在某个函数开头设置断点
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • info(i) locals:查看当前栈帧局部变量的值

 Linux下包括软件的安装(yum)、代码编辑(vim多模式编辑器)、代码编译(gcc/g++编译器)、代码调试(gdb),自动化构建代码(make/makefile),这五种开发工具就介绍完了。每个开发工具多多少少都会有一些指令,不用可以去记忆这些指令,可以的去用指令刻意练习,慢慢就会熟练使用指令。今天的分享到这里就结束了,如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!


下篇预告——冯诺依曼体系结构

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

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

相关文章

c面向对象编码风格(上)

面向对象和面向过程的基本概念 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在软件开发中用于组织和设计代码的方式。 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;函数、方法&#xff09;为核心的编程方式。在面向过程…

2021年电工杯数学建模B题光伏建筑一体化板块指数发展趋势分析及预测求解全过程论文及程序

2021年电工杯数学建模 B题 光伏建筑一体化板块指数发展趋势分析及预测 原题再现&#xff1a; 国家《第十四个五年规划和 2035 年远景目标纲要》中提出&#xff0c;将 2030 年实现“碳达峰”与 2060 年实现“碳中和”作为我国应对全球气候变暖的一个重要远景目标。光伏建筑一体…

七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到LongLora版LLaMA、Mistral

前言 如此前这篇文章《学术论文GPT的源码解读与微调&#xff1a;从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述&#xff0c;对于论文的摘要/总结、对话、翻译、语法检查而言&#xff0c;市面上的学术论文GPT的效果虽暂未有多好&#xff0c;可至少还过得去&am…

1.Netty概述

原生NIO存在的问题(Netty要解决的问题) 虽然JAVA NIO 和 JAVA AIO框架提供了多路复用IO/异步IO的支持&#xff0c;但是并没有提供给上层“信息格式”的良好封装。JAVA NIO 的 API 使用麻烦,需要熟练掌握 ByteBuffer、Channel、Selector等 , 所以用这些API实现一款真正的网络应…

题解:轮转数组及复杂度分析

文章目录 &#x1f349;前言&#x1f349;题目&#x1f34c;解法一&#x1f34c;解法二&#xff1a;以空间换时间&#x1f95d;补充&#xff1a;memmove &#x1f34c;解法三&#xff08;选看&#xff09; &#x1f349;前言 本文侧重对于复杂度的分析&#xff0c;题解为辅。 …

02-React组件与模块

组件与模块 前期准备 安装React官方浏览器调试工具&#xff0c;浏览器扩展搜索即可 比如红色的React就是本地开发模式 开启一个用React写的网站&#xff0c;比如美团 此时开发状态就变成了蓝色 组件也能解析出来 何为组件&模块 模块&#xff0c;简单来说就是JS代…

亚马逊云科技大语言模型下的六大创新应用功能

目录 前言 亚马逊云科技的AI创新应用 ​编辑 Amazon CodeWhisperer Amazon CodeWhisperer产品的优势 更快地完成更多工作 自信地进行编码 增强代码安全性 使用收藏夹工具 自定义 CodeWhisperer 以获得更好的建议 如何使用Amazon CodeWhisperer 步骤 1 步骤 2 具体…

php7.4.32如何快速正确的开启OpenSSL扩展库,最简单的办法在这里!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

GNU ld链接器 lang_process()(二)

一、ldemul_create_output_section_statements() 位于lang_process()中11行 。 该函数用于创建与目标有关的输出段的语句。这些语句将用于描述输出段的属性和分配。 void ldemul_create_output_section_statements (void) {if (ld_emulation->create_output_section_sta…

PS Raw中文增效工具Camera Raw 16

Camera Raw 16 for mac&#xff08;PS Raw增效工具&#xff09;的功能特色包括强大的图像调整工具。例如&#xff0c;它提供白平衡、曝光、对比度、饱和度等调整选项&#xff0c;帮助用户优化图像的色彩和细节。此外&#xff0c;Camera Raw 16的界面简洁易用&#xff0c;用户可…

每日一题 187. 重复的DNA序列(中等)

由于今天做了周赛&#xff0c;每日一题就简单点直接暴力哈希 class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:d defaultdict(int)ans []for i in range(len(s) - 9):t s[i: i 10]d[t] 1if d[t] 2:ans.append(t)return ans

CCC数字钥匙设计【NFC】 --通过NFC进行车主配对Phase4

1、车主配对流程介绍 车主配对可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase4进行介绍。 1) Phase0&#xff1a;准备阶段&#xff1b; 2) Phase1&#xff1a;启动流程&#xff1…

凸优化问题(最简单)

一、凸优化问题 1.1 概念 凸优化问题minf(x)&#xff1a;需要同时满足两个条件&#xff1a;变量可行域时凸的(convex)&#xff1b;目标函数也是凸函数(convex)。 &#xff08;1&#xff09;变量x的可行域Ω为凸集&#xff0c;即对于集合Ω中任意两点x1、x2∈Ω&#xff0c;他…

使用阿里云服务器,httplib库在listen过程中,出现Cannot assign requested address错误???

今天&#xff0c;在做一个小项目的时候&#xff0c;使用httplib库进行建立tcp连接&#xff0c;但是一旦程序开始&#xff0c;并没有等待tcp连接的到来&#xff0c;而是直接结束了。 打印一下strerror(errno) 根本就没有进行客户端的连接。 找了一下午&#xff0c;检测是否…

SEO优化的好帮手,5个必备的好工具

做海外市场的企业&#xff0c;谷歌SEO是一个非常重要的方式&#xff0c;帮助提高自己企业的网站曝光&#xff0c;起着至关重要的作用&#xff0c;因为人们普遍会通过网上搜索来找到那些适合的商品&#xff0c;与排名靠后的公司相比&#xff0c;出现在搜索结果顶部的公司往往能吸…

有人物联网模块连接阿里云物联网平台的方法

摘要&#xff1a;本文介绍有人物联网模块M100连接阿里云的参数设置&#xff0c;作为说明书的补充。 没有阿里云功能需求的请略过本文&#xff0c;不要浪费您宝贵的时间。 网络选择LTE&#xff0c;请先确保插入的SIM卡有流量。 接下来配置阿里云云服务。如下图所示&#xff0c;…

802.11 CSMA/CA协议

《计算机网络自顶向下》P351的总结提炼

Linux应用开发基础知识——交叉编译与gcc编译(一)

前言&#xff1a; 源文件需要经过编译才能生成可执行文件。在 Windows 下进行开发时&#xff0c;只需 要点几个按钮即可编译&#xff0c;集成开发环境(比如 Visual studio)已经将各种编译 工具的使用封装好了。Linux 下也有很优秀的集成开发工具&#xff0c;但是更多的时候是 直…

x264交叉编译(ubuntu+arm)

1.下载源码 https://code.videolan.org/videolan/x264 在windows下解压&#xff1b;复制到ubuntu&#xff1b; 2.进入源码文件夹-新建脚本文件 touch sp_run.sh 3.在sp_run.sh文件中输入 #!/bin/sh./configure --prefix/home/alientek/sp_test/x264/sp_install --enable-…

Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式 Gradle 中的依赖分别为直接依赖&#xff0c;项目依赖&#xff0c;本地jar 依赖。 dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(:subject01)//②.直接依赖本地的某个jar文件implementation files(libs/foo.jar, libs/bar.jar…