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

【Linux操作系统】深入了解系统编程gdb调试工具

在软件开发过程中,调试是一个非常重要的步骤。无论是在开发新的软件还是维护现有的代码,调试都是解决问题的关键。对于Linux开发者来说,GDB是一个非常有用的调试工具。在本文中,我们将探讨Linux中使用GDB进行调试的方法和技巧。
在这里插入图片描述

文章目录

    • 一、安装gdb
    • 二、编译可调试的程序
    • 三、启动gdb调试
    • 四、设置断点
    • 五、观察变量的值
    • 六、单步执行程序
    • 七、观察堆栈
    • 八、修改变量的值
    • 九、继续执行程序
    • 十、条件断点
    • 十一、查看源代码
    • 十二、查看内存内容
    • 十三、调试崩溃程序
    • 十四、远程调试
    • 十五、调试多线程程序
    • 十六、调试动态链接库
    • 十七、退出调试
    • 总结:

GDB是GNU调试器的缩写,是一个功能强大的调试工具,可用于调试各种编程语言的程序。它可以帮助开发者找出程序中的错误,并提供了一些高级功能,如断点设置、变量跟踪和内存分析等。

一、安装gdb

在大多数Linux发行版中,gdb已经预装。如果没有安装,可以通过以下命令安装:

sudo apt-get install gdb

二、编译可调试的程序

为了进行调试,我们首先需要编译一个可调试的程序。在编译时,需要添加-g参数,以生成调试信息。例如,编译一个简单的C程序:

#include <stdio.h>int main() {int a = 5;int b = 0;int c = a / b;printf("Result: %d\n", c);return 0;
}

使用以下命令编译:

gcc -g -o debug_program debug_program.c

这将生成一个名为debug_program的可执行文件。

三、启动gdb调试

在命令行中输入以下命令启动gdb调试:

gdb debug_program

gdb将显示以下提示符:

(gdb)

四、设置断点

在程序中设置断点可以让我们在指定的位置停下来观察程序的状态。使用gdb的break命令可以设置断点。
例如,在main函数的第6行设置一个断点:

(gdb) break main.c:6

设置断点后,我们可以使用run命令运行程序:

(gdb) run

程序将运行到断点处停下来。

五、观察变量的值

在程序运行到断点处时,我们可以使用gdb的print命令观察变量的值。例如,我们想要查看变量a的值,可以输入以下命令:

(gdb) print a

gdb将显示变量a的值。

六、单步执行程序

使用gdb的next命令可以逐行执行程序。例如,输入以下命令:

(gdb) next

程序将执行下一行代码,并在执行完成后停下来。

七、观察堆栈

在调试过程中,我们经常需要观察函数调用的堆栈信息。使用gdb的backtrace命令可以显示当前的堆栈信息。例如,输入以下命令:

(gdb) backtrace

gdb将显示当前的堆栈信息。

八、修改变量的值

在调试过程中,有时我们需要修改变量的值以验证程序的行为。使用gdb的set命令可以修改变量的值。例如,我们想要将变量a的值修改为10,可以输入以下命令:

(gdb) set a = 10

变量a的值将被修改为10。

九、继续执行程序

使用gdb的continue命令可以继续执行程序,直到下一个断点或程序结束。例如,输入以下命令:

(gdb) continue

程序将继续执行。

十、条件断点

除了在特定行设置断点外,我们还可以设置条件断点,即只在满足特定条件时才停下来。使用gdb的break命令加上if关键字可以设置条件断点。例如,我们想要在变量a的值为5时停下来,可以输入以下命令:

(gdb) break main.c:6 if a == 5

当变量a的值为5时,程序将停在第6行。

十一、查看源代码

在调试过程中,我们可能需要查看源代码以更好地理解程序的逻辑。使用gdb的list命令可以显示当前位置周围的源代码。例如,输入以下命令:

(gdb) list

gdb将显示当前位置周围的源代码。

十二、查看内存内容

有时,我们需要查看程序运行时的内存内容。使用gdb的x命令可以查看内存的内容。例如,我们想要查看变量a的内存内容,可以输入以下命令:

(gdb) x &a

gdb将显示变量a的内存内容。

十三、调试崩溃程序

当程序崩溃时,我们可以使用gdb来进行调试。启动gdb并指定崩溃的程序,例如:

gdb -c core debug_program

gdb将加载core文件并显示崩溃时的堆栈信息。

十四、远程调试

在某些情况下,我们可能需要在远程机器上进行调试。使用gdb的target命令可以进行远程调试。例如,我们想要在IP地址为192.168.0.100的机器上调试程序,可以输入以下命令:

(gdb) target remote 192.168.0.100:1234

gdb将连接到远程机器并进行调试。

十五、调试多线程程序

在调试多线程程序时,我们可以使用gdb的thread命令来切换和观察不同的线程。例如,输入以下命令切换到线程1:

(gdb) thread 1

gdb将切换到线程1并显示相关信息。

十六、调试动态链接库

如果程序依赖于动态链接库,我们可以使用gdb来调试动态链接库中的代码。启动gdb并指定可执行文件和动态链接库,例如:

gdb debug_program -ex 'set solib-search-path /path/to/shared/library'

gdb将加载动态链接库并允许我们在其中进行调试。

十七、退出调试

当我们完成调试任务或者不再需要使用gdb时,可以使用gdb的quit命令退出调试。例如,输入以下命令:

(gdb) quit

gdb将退出调试模式并返回到终端。

另外,如果我们只是想临时中断调试而不退出gdb,可以使用gdb的detach命令。例如,输入以下命令:

(gdb) detach

gdb将与正在调试的程序分离,但仍保持运行状态。

总结:

本文详细介绍了Linux中gdb调试工具的使用方法,并通过实例演示了其调试功能。通过使用gdb,开发者可以更好地定位和解决程序中的bug,提高开发效率。

相关文章:

【Linux操作系统】深入了解系统编程gdb调试工具

在软件开发过程中&#xff0c;调试是一个非常重要的步骤。无论是在开发新的软件还是维护现有的代码&#xff0c;调试都是解决问题的关键。对于Linux开发者来说&#xff0c;GDB是一个非常有用的调试工具。在本文中&#xff0c;我们将探讨Linux中使用GDB进行调试的方法和技巧。 …...

linux 安装go 1.18版本

首先去官网找到对应的版本 直接下载下来&#xff08;如果服务器可以直接访问到go 官网也可以wget直接下载到服务器&#xff09; 然后把该包上传到linux 的/usr/local 目录下 然后直接解压安装该包&#xff1a; sudo tar -C /usr/local -zxvf go1.18.10.linux-amd64.tar.gz 然…...

LLVM笔记2 Intermediate Representation (IR)

参考链接&#xff1a;https://llvm.org/devmtg/2019-04/slides/Tutorial-Bridgers-LLVM_IR_tutorial.pdf https://zhuanlan.zhihu.com/p/163063995 https://zhuanlan.zhihu.com/p/163328574 文章目录 IR的布局1. IR语法2.IR递归函数3.使用迭代的方式4.全局变量5.LLVM’s type s…...

篇五:原型模式:复制对象的秘密

篇五&#xff1a;"原型模式&#xff1a;复制对象的秘密" 设计模式是软件开发中的重要组成部分&#xff0c;原型模式是创建型设计模式中的一种。原型模式旨在通过复制现有对象来创建新的对象&#xff0c;而不是通过调用构造函数来创建。在C中&#xff0c;原型模式广泛…...

为什么ip地址一直在变化

IP地址是计算机网络中用于唯一标识一台设备的二进制数字串。在互联网中&#xff0c;每台计算机都需要一个唯一的IP地址&#xff0c;以便与其他计算机进行通信。然而&#xff0c;有些情况下&#xff0c;IP地址可能会发生变化。 有多种原因可能导致IP地址发生变化。下面虎观代理…...

10.物联网操作系统之低功耗管理

一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为&#xff1a; 1.备份域&#xff1a;备份电源&#xff0c;仔细在stm32的板子上寻找&#xff0c;大多都有纽扣电池。 注意&#xff1a;参考手册&#xff08;PWR&#xff09;章节有详细的介绍。 2.…...

SQL SERVER 2019 数据库还原测试库的方法

1、备份正式库数据 2、在其它电脑上还原备份的数据库 不需要覆盖其它数据库&#xff0c;直接还原出数据库 还原时修改文件名和数据库名称&#xff1a; 修改文件名称 还原成功...

leetcode 62. 不同路径

2023.8.8 用dp算法一遍过了&#xff0c;很舒服。 重点还是要确定dp数组的含义&#xff0c;本题的dp数组要设成二维的&#xff0c;dp[i][j]的含义是&#xff1a;到&#xff08;i&#xff0c;j&#xff09;这个点一共有多少种路径。由于题中说了m和n都大于1&#xff0c;所以假设一…...

ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)

文章目录 1.常见的芯片类型2.数字隔离芯片有什么用&#xff1f;3.I2C的I/O扩展芯片说明4.16位I/O扩展芯片TCAL6416的features、applications、description5.TCAL6416的引脚功能6.TCAL6416的电气特性7.TCAL6416的典型特性&#xff08;图像&#xff09;8.TCAL6416的参数测量信息&…...

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…...

K最近邻算法:简单高效的分类和回归方法(三)

文章目录 &#x1f340;引言&#x1f340;训练集和测试集&#x1f340;sklearn中封装好的train_test_split&#x1f340;超参数 &#x1f340;引言 本节以KNN算法为主&#xff0c;简单介绍一下训练集和测试集、超参数 &#x1f340;训练集和测试集 训练集和测试集是机器学习和深…...

【数据分析专栏之Python篇】五、pandas数据结构之Series

前言 大家好&#xff01;本期跟大家分享的知识是 Pandas 数据结构—Series。 一、Series的创建 Series 是一种类似于一维数组的对象&#xff0c;由下面两部分组成&#xff1a; values&#xff1a;一组数据&#xff0c;ndarray 类型index&#xff1a;数据索引 顾名思义&…...

中间件多版本冲突的4种解决方案和我们的选择

背景 在小小的公司里面&#xff0c;挖呀挖呀挖。最近又挖到坑里去了。一个稳定运行多年的应用&#xff0c;需要在里面支持多个版本的中间件客户端&#xff1b;而多个版本的客户端在一个应用里运行时会有同名类冲突的矛盾。在经过询问chatGPT&#xff0c;百度&#xff0c;googl…...

对 async/await 的理解

async/await 的理解 async/await 其实是 Generator 的语法糖&#xff0c;它能实现的效果都能用then 链来实现&#xff0c;它是为优化 then 链而开发出来的。从字面上来看&#xff0c;async 是“异步”的简写&#xff0c;await 则为等待&#xff0c;所以很好理解async用于申明一…...

Vue 整合 Element UI 、路由嵌套、参数传递、重定向、404和路由钩子(五)

一、整合 Element UI 1.1 工程初始化 使用管理员的模式进入 cmd 的命令行模式&#xff0c;创建一个名为 hello-vue 的工程&#xff0c;命令为&#xff1a; # 1、目录切换 cd F:\idea_home\vue# 2、项目的初始化&#xff0c;记得一路的 no vue init webpack hello-vue 1.2 安装…...

修改 Ubuntu 系统的时区

修改 Ubuntu 系统的时区 如果 Ubuntu 系统的时区设置不正确&#xff0c;您可以按照以下步骤进行调整&#xff1a; 1. 查看当前的时区设置&#xff0c;可以使用以下命令&#xff1a; timedatectl 这将显示当前系统的日期、时间和时区信息。 2. 如果时区设置不正…...

如何离线安装ModHeader - Modify HTTP headers Chrome插件?

如何离线安装ModHeader - Modify HTTP headers Chrome插件&#xff1f; 1.1 前言1.2 打开Chrome浏览器的开发者模式1.3 下载并解压打包好的插件1.4 解压下载好的压缩包1.5 加载插件1.6 如何使用插件? 1.1 前言 ModHeader 是一个非常好用的Chrome浏览器插件&#xff0c;可以用…...

在Linux中安装MySQL

在Linux中安装MySQL 检测当前系统中是否安装MySQL数据库 命令作用rpm -qa查询当前系统中安装的所有软件rpm -qa|grep mysql查询当前系统中安装的名称带mysql的软件rpm -qa | grep mariadb查询当前系统中安装的名称带mariadb的软件 RPM ( Red-Hat Package Manager )RPM软件包管理…...

python --windows获取启动文件夹路径/获取当前用户名/添加自启动文件

如何使用Python获取计算机用户名 一、Python自带的getpass模块可以用于获取用户输入的密码&#xff0c;但是它同样可以用来获取计算机用户名。 import getpassuser getpass.getuser() print("计算机用户名为&#xff1a;", user)二、使用os模块获取用户名 Python的…...

微信云托管(本地调试)⑥:nginx、vue刷新404问题

一、nginx默认路径 1.1、默认配置文件路径&#xff1a;/etc/nginx/nginx.conf 1.2、默认资源路径&#xff1a;/usr/share/nginx/html/index.html 二、修改nginx.conf配置 &#xff08;注意配置中的&#xff1a;include /etc/nginx/conf.d/*.conf; 里面包了一个server配置文件…...

wxappUnpacker:让微信小程序源代码重见天日的开发者利器

wxappUnpacker&#xff1a;让微信小程序源代码重见天日的开发者利器 【免费下载链接】wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 在微信小程序开发过程中&#xff0c;开发者常常面临源代码被打包加密的困境&#xff0c;特别是当需…...

DeerFlow开源项目部署与实践指南:从环境准备到生产落地

DeerFlow开源项目部署与实践指南&#xff1a;从环境准备到生产落地 【免费下载链接】deer-flow DeerFlow is a community-driven framework for deep research, combining language models with tools like web search, crawling, and Python execution, while contributing ba…...

nli-distilroberta-base效果展示:Entailment/Contradiction/Neutral三类判别置信度热力图

nli-distilroberta-base效果展示&#xff1a;Entailment/Contradiction/Neutral三类判别置信度热力图 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)Web服务&#xff0c;专门用于分析两个句子之间的逻辑关系。这个轻量级模型能够快速准确地…...

轻量部署开源网络性能测试工具:从环境搭建到性能调优全指南

轻量部署开源网络性能测试工具&#xff1a;从环境搭建到性能调优全指南 【免费下载链接】speedtest 项目地址: https://gitcode.com/gh_mirrors/spe/speedtest 在网络运维与开发过程中&#xff0c;准确掌握网络带宽性能是保障服务质量的关键。本文将介绍如何使用开源速…...

消息防撤回技术全解析:从原理到实践的即时通讯数据保护方案

消息防撤回技术全解析&#xff1a;从原理到实践的即时通讯数据保护方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁&#xff08;我已经看到了&#xff0c;撤回也没用了&#xff09; 项目地址: https://gitco…...

多维对比:2026 年主流 AI 证书的含金量权重与选择策略

随着生成式 AI 技术的全面渗透&#xff0c;企业对 AI 人才的需求已从 “储备型” 转向 “实战型”。2026 年 AI 证书市场迎来爆发式增长&#xff0c;其中 CAIE注册人工智能工程师认证与国内外科技大厂生态认证成为职场人、应届生及转型者的核心选择方向。盲目跟风考证易导致 “…...

M2LOrder模型Git版本控制实践:团队协作下的模型微调与部署

M2LOrder模型Git版本控制实践&#xff1a;团队协作下的模型微调与部署 你是不是也遇到过这样的情况&#xff1f;团队里几个人一起折腾一个AI模型&#xff0c;今天张三改了点代码&#xff0c;明天李四更新了配置文件&#xff0c;后天王五又传了个新数据集。结果没过几天&#x…...

可解释推荐-TKDE 24|基于强化路径推理的反事实解释优化策略

1. 为什么我们需要更好的推荐解释&#xff1f; 你有没有遇到过这种情况&#xff1a;某购物平台突然给你推荐了一款完全不符合你品味的商品&#xff0c;或者视频平台连续推送你根本不感兴趣的短视频&#xff1f;这时候你可能会想&#xff1a;"这个推荐系统到底是怎么想的&…...

Maestro移动测试自动化成长路径:从零基础到专家的完整技能图谱

Maestro移动测试自动化成长路径&#xff1a;从零基础到专家的完整技能图谱 【免费下载链接】maestro Painless Mobile UI Automation 项目地址: https://gitcode.com/GitHub_Trending/ma/maestro 想要构建可靠的移动应用测试体系却不知从何开始&#xff1f;Maestro移动测…...

别再死记硬背了!用‘神经元工作原理’理解你背单词为什么总忘

别再死记硬背了&#xff01;用‘神经元工作原理’理解你背单词为什么总忘 背单词时总是前脚记后脚忘&#xff1f;这其实不是记忆力的问题&#xff0c;而是方法的问题。我们的大脑就像一台精密的生物计算机&#xff0c;而记忆的形成和巩固遵循着特定的神经科学规律。理解这些规…...