当前位置: 首页 > news >正文

深入了解Linux —— 调试程序

前言

我们已经学习了linux下许多的工具,vimgccmake/makefile等;

已经能够在linux写代码,并且进行编译运行,让程序在linux下跑起来。

但是,如果我们在写代码的时候遇见了错误;但是我们并不知道错误在哪,在windows下,我们可以进行调试来查找代码错误的位置进行修改;我们在linux就只能查看源代码,直接查找错误,这样很麻烦;

现在就来学习linux如何调试程序。

调试程序 ——gdb/cgdb

Debug/Release模式

在之前学习C语言时,听说过DebugRelease,只知道Debug时用来调试的,程序员写代码的版本;而Release是发布版本。

现在我们来看一下这两个模式有什么区别

  • 首先的区别就是Debug会生成程序的调试信息,而Release不会生成程序的调试信息。

因为Debug模式会生成调试信息,所以Debug模式的程序就要比Release模式的程序大小要大。

我们如何验证呢?

linuxgcc编译默认生成的是Release版本,我们要生成Debug模式就要带-g选项。

现在有这样一段代码test.c文件

#include<stdio.h>
int func(int n)
{int ret = 0;for (int i = 1; i <= n; i++){ret += i;}return n;
}
int main()
{int n = 100;int sum = func(n);printf("sum = %d\n", sum);return 0;
}

我们在linux下进行编译

在这里插入图片描述

这里有这样的提示,那是因为C98不支持在for循环中定义变量,要使用C99,上面也有提示。

所以我们就要这样来编译

gcc test.c -o test -st=c99

这里写成makefile方便操作。

这样生成的是Release模式的程序,我们查看它文件属性

在这里插入图片描述

现在,我们使用-g选项生成Debug模式的程序

在这里插入图片描述

可以看到Debug模式的要比Release模式的程序要大一些。

gdb/cgdb的使用

这里,只有Debug模式的程序才能被调试;Release模式下不能被调试,因为缺少调试信息。

在使用之前可能需要进行安装

yum -install -y gdb
yum -install -y cgdb

1. 进入调试

gdb 可执行程序

这里无论是gdb还是cgdb,都是可执行程序,对可执行程序进行调试。

在这里插入图片描述

可以看到这样就进入gdb调试了,但是gdb调试现在看不到我们的源代码。

2. 退出调试

quit

在这里插入图片描述

现在来看一下cgdb调试的界面

cgdb test

在这里插入图片描述

这样的界面看起来要比gdb好用一些,所以这里就以cgdb为例,来学习调试

cgdb中,屏幕上半部分可以看到一部分代码;其中绿色箭头指向的地方就是当前程序运行的位置。

退出调试仍然是quit

3. 查看代码

查看代码,l;后可以什么的不跟,也可以跟行号或者函数名

  • l :查看源代码,从上次位置开始,依次显示10行代码
  • l 文件名:行号 :列出指定文件的源代码
  • l 函数名 :列出指定函数的源代码

在这里插入图片描述

l 文件名:行号
在这里插入图片描述

l:函数名

在这里插入图片描述

这里列出的可能有一些差别。

4. 运行代码

我们进入调试,但是代码并没有运行起来;在windows下我们之间F5就让代码运行起来了;而cgdbr命令可以让代码运行起来

r/run,执行代码:

在这里插入图片描述

逐步执行

有了断点,我们在r时程序就会停止在断点处,那我们该如何一行一行执行代码呢?

windows下,我们是按F10F11来依次执行代码;

linuxcgdb,我们使用n/nexts/step来依次执行代码

n/next,相当于F10,一行一行执行代码, 在遇到函数时,不进入函数内部;

s/step,就相当于F11,一行一行执行代码, 在遇到函数时,进入函数内部;

这里就不演示了。

执行到某处

在我们调试程序时,程序现在停止在一个断点处,我们不想一行一行执行代码,而是想要让程序直接运行到下一个代码;

只需要指向c/contine即可

c/continue

在这里插入图片描述

r 重新执行

如果现在程序正在执行,我们想要让程序重新执行,只需要r即可;

这是会询问我们是否重新执行,y即可

在这里插入图片描述

finish

执行到当前函数结束,然后停止

在这里插入图片描述

until 执行到某一行

until 行号 程序执行到某一行然后停止。

在这里插入图片描述

现在执行until 11,让程序执行到11行。

在这里插入图片描述

5. 断点

增加/删除断点

我们指向run/r后,发现代码直接就执行结束了;但是在我们调试的时候,我们并不希望代码执行运行结束,我们需要通过断点让代码在指定位置停下来;

windows下,我们通过快捷键F9或者鼠标点击来打断点和去掉断点;

cgdb中,我们通过命令**b/break**来打断点,通过delete/d来取消断点。

b打断点

  • b 行号:在指定行打断点
  • b 函数名:在函数开头打断点

在这里插入图片描述

可以看到,我们打断点之后并看不到任何断点信息,那如果我们想要看到已经存在的断点,可以使用命令info b来查看

info b查看所有断点信息

在这里插入图片描述

d删除断点

我们打断点可以通过行号,但是删除断点我们就不能使用行号了,而是使用Num 断点编号。

在这里插入图片描述

这里还要注意一个点,断点编号时不断递增的,不会随着我们删除断点而减小

什么意思呢,就是现在存在两个断点我们删除了其中一个断点,然后再次创建了一个断点,它的编号就是3而不是2

在这里插入图片描述

这样有了断点,我们在执行r时就程序就会停止在断点处。

在这里插入图片描述

这里看一下上半代码部分,可以看到程序停在了15行,并且断点位置的行号颜色为红色。

启用/禁用断点

当我们在调试程序时,我们增加的断点并不一定所有的都能用的到,有一些断点我们不想让它在这次调试中起作用,这时就可以禁用这个断点

看到这里可能有疑惑,为什么不直接删除呢?

如果代码非常的多,删除了之后,接下来调试要用到,又要重新去找,非常浪费时间。

启用断点

enable 断点编号

禁用断点

disable 断点编号

这里断点默认是启用状态的。

在这里插入图片描述

那现在执行一下看是否真的禁用了呢?

在这里插入图片描述

可以看到第一个断点并未触发,而是直接触发第二个断点。

6. 监视

windows下我们通过监视窗口来查看一个变量的值;

而在linuxcgdb中,我们也可以通过指令来查看变量的值。

监视变量

p

p 用来查看一个变量当前的值

在这里插入图片描述

但是这样,我们在此执行代码会发现,执行过后就不在显示了;

这样我们每次查看就要去输入指令p 变量名,这样好麻烦,我们想要每一次执行过后,它都会显示出来变量的值

display用来跟踪显示变量的值。

display
在这里插入图片描述

如上图所示,我们每一次执行代码,变量的值都会显示出来。

监视函数栈帧内局部变量

如果我们不是想要查看某一个变量,而是查看当前函数内所有的局部变量?

我们就要用到info/i locals

在这里插入图片描述

可以看到func中所有的局部变量都显示出来了。

查看当前函数调用栈帧

如果我们想要查看当前的函数调用栈帧,直接使用bt/backtrace即可。

在这里插入图片描述

cgdb常用小技巧

1. watch

watch:用来监视一个变量的值是否发生变化,发生变化时会提示。
在这里插入图片描述

我们使用info b查看断点中也可以看到watch监视的变量。

2. set war

set war:在调试过程中,修改变量的值。

在这里插入图片描述

可以看到,我们在调试过程中,使用set var就可以修改一个变量的值。

3. 条件断点

添加条件断点

b 行号 if 条件

在这里插入图片描述

如上图所示,新添加的条件断点(当i==10时触发)。

在这里插入图片描述

可以看到程序在i==0时,断点触发,停止在第九行。

给已存在断点增加条件

当我们需要给已经存在的断点增加条件时,我们需要指令

condition 断点编号 条件

在这里插入图片描述

到这里本篇内容就结束了,希望对你有所帮助。

制作不易,感谢大佬的支持。

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws

相关文章:

深入了解Linux —— 调试程序

前言 我们已经学习了linux下许多的工具&#xff0c;vim、gcc、make/makefile等&#xff1b; 已经能够在linux写代码&#xff0c;并且进行编译运行&#xff0c;让程序在linux下跑起来。 但是&#xff0c;如果我们在写代码的时候遇见了错误&#xff1b;但是我们并不知道错误在哪&…...

JVM - 3.垃圾回收

1.垃圾收集的经典问题 1.哪些内存需要回收2.什么时候回收3.如何回收1.你知道哪几种垃圾回收器&#xff0c;各自的优缺点&#xff0c;重点讲一下cms和g12.JVM GC算法有哪些&#xff0c;目前的JDK版本采用什么回收算法3.G1回收器的回收过程 1.Java中垃圾的定义&#xff08;Garbag…...

vs code 设置字体颜色

修改setting.json文件 {"remote.SSH.remotePlatform": {"ubuntu": "linux"},// "workbench.colorTheme": "One Dark Pro",// "editor.semanticTokenColorCustomizations": {// },"editor.semanticTokenColo…...

MoonSharp 文档一

目录 1.Getting Started(入门手册) 步骤1:在 IDE 中引入 MoonSharp 步骤2:引入命名空间 步骤3:调用脚本 步骤4:运行代码 2.Keeping a Script around(保留一个脚本) 步骤1:复现前教程所有操作 步骤2:改为创建Script对象 步骤3:访问全局环境 步骤4:直接调用…...

Unity3D 图形渲染(Graphics Rendering)详解

前言 Unity3D 是一款广泛使用的游戏引擎&#xff0c;其图形渲染系统是开发者创建高质量视觉效果的核心。本文将深入探讨 Unity3D 的图形渲染管线、渲染技术、以及如何通过代码实现自定义渲染效果。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;大家可以点击进来一…...

计算机视觉图像点运算【灰度直方图均衡化图形界面实操理解 +开源代码】

对一个数字图像处理系统来说&#xff0c;一般的处理过程为三个步骤&#xff1a;图像预处理、特征抽取、图像识别和分析。图像的点运算就是预处理过程中的重要一步&#xff0c;点运算是对图像的灰度级进行变换。 图像点运算概念 点运算是指对图像的每个像素依次进行相同的灰度变…...

在Windows 7操作系统,基于llama.cpp本地化部署 deepseek-r1模型的方法 2025-02-08

一、概述 现在已经是大模型时代。 个人认为&#xff0c;deepseek效果惊艳&#xff0c;大模型已进入实用阶段。 有些电脑&#xff0c;由于种种原因&#xff0c;还在用 Windows 7&#xff0c; Windows XP 等操作系统。 为了让这些电脑用上大模型&#xff0c;本教程在 llama.c…...

力扣146 - LRU缓存

视频讲解 哈希 双向链表 为什么要用双向链表&#xff1f; 快速删除节点&#xff08;O(1&#xff09;&#xff09; 如果是单链表的话&#xff0c;删除一个节点时&#xff0c;需要从头遍历&#xff0c;找到前驱节点&#xff0c;才能修改 prev->next&#xff0c;导致 O(n)…...

C++ 算法竞赛STL以及常见模板

目录 STL /*═══════════════ Vector ═══════════════*/ /*════════════════ Pair ════════════════*/ /*══════════════ String ════════════════*/ /*══════════…...

微信小程序将markdown内容转为pdf并下载

要在微信小程序中将Markdown内容转换为PDF并下载,您可以使用以下方法: 方法一:使用第三方API服务 选择第三方API服务: 可以选择像 Pandoc、Markdown-PDF 或 PDFShift 这样的服务,将Markdown转换为PDF。例如,PDFShift 提供了一个API接口,可以将Markdown内容转换为PDF格式…...

AI绘画软件Stable Diffusion详解教程(7):图生图基础篇(改变图像风格)

我们在使用AI魔盒不停的绘制一幅幅图像时&#xff0c;会有这样的疑问&#xff1a;为什么生成的图像随机性这么强&#xff1f;我们如何按照自己的构图创作作品&#xff1f;为什么提示词生成的图像细节不够&#xff1f;如何把手绘的风格转换成另一种风格&#xff0c;或者说把自己…...

ES映射知识

映射 映射类似于关系型数据库的Schema&#xff08;模式&#xff09;。 映射来定义字段列和存储的类型等基础信息。 {"mappings": {"properties": {"username": {"type": "keyword","ignore_above": 256 // 忽略…...

蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第七届题目解析源码&…...

SpringBoot项目配置文件

SpringBoot项目提供了多种属性配置方式&#xff08;properties、yaml、yml&#xff09; yml配置文件 使用Apifox可以方便开发接口、前端测试等 工程搭建&#xff1a; 1.创建SpringBoot工程&#xff0c;并引入web开发起步依赖、mybatis、mysql驱动、lombok 2.创建数据库表&am…...

PythonWeb开发框架—Flask框架之flask-sqlalchemy、序列化和反序列化使用详解

1.安装依赖库 pip install flask-sqlalchemy pip install pymysql 2.连接数据库配置 from flask import Flask from flask_sqlalchemy import SQLAlchemyapp Flask(__name__) #创建 Flask 应用实例#配置数据库连接 app.config[SQLALCHEMY_DATABASE_URI]mysql://root:stud…...

如何监控 Pod 的 CPU/内存使用率,prometheus+grafana

一、监控 Pod 的 CPU/内存使用率的方法 1. 使用 kubectl top 命令&#xff08;临时检查&#xff09; # 查看所有 Pod 的资源使用率&#xff08;需安装 Metrics Server&#xff09; kubectl top pods --all-namespaces ​ # 查看指定命名空间的 Pod kubectl top pods -n <n…...

Spring Batch 概览

Spring Batch 是什么&#xff1f; Spring Batch 是 Spring 生态系统中的一个轻量级批处理框架&#xff0c;专门用于处理大规模数据任务。它特别适合企业级应用中需要批量处理数据的场景&#xff0c;比如数据迁移、报表生成、ETL&#xff08;Extract-Transform-Load&#xff09…...

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…...

AF3 squeeze_features函数解读

AlphaFold3 data_transforms 模块的 squeeze_features 函数的作用去除 蛋白质特征张量中不必要的单维度&#xff08;singleton dimensions&#xff09;和重复维度&#xff0c;以使其适配 AlphaFold3 预期的输入格式。 源代码&#xff1a; def squeeze_features(protein):&qu…...

Python 远程抓取服务器日志最后 1000行

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、神奇的 Python 工具箱 1. SSH 连接的密钥——paramiko paramiko 库提供了丰富的方法来处理 SSH 连接的各种细节。从创建连接对象&#xff0c;到执行远程命令&#xff0c;再到获取命令输出&#xff0c;它都能有…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...