Linux 使用 GDB 进行调试的常用命令与技巧

news2025/5/19 20:43:09

GDB 调试的常用命令与技巧

    • 1. GDB 常用命令
      • 1.1 安装 GDB
      • 1.2 启动 GDB
      • 1.3 设置程序的参数
      • 1.4 设置断点
      • 1.5 启动程序并运行至断点
      • 1.6 执行一步
      • 1.7 打印变量值
      • 1.8 查看函数调用栈
    • 2. GDB 调试 Core 文件
      • 2.1 生成 Core 文件
      • 2.2 使用 GDB 调试 Core 文件
    • 3. GDB 调试正在运行的程序
      • 3.1 附加到正在运行的进程
      • 3.2 在进程中设置断点
      • 3.3 恢复程序执行

GDB(GNU Debugger)是一个功能强大的调试工具,可以帮助开发者在程序运行过程中查找和修复问题。本文将介绍如何使用 GDB 调试程序,包括常用命令、调试 core 文件和正在运行的程序。

1. GDB 常用命令

在使用 GDB 调试程序时,掌握一些常用命令非常重要。以下是一些基础命令和用法:

1.1 安装 GDB

在 Linux 系统中,使用以下命令安装 GDB:

yum -y install gdb

或者在 Ubuntu 系统中使用:

sudo apt-get install gdb

1.2 启动 GDB

要启动 GDB 并调试一个程序,可以使用以下命令:

gdb 目标程序

例如,调试一个名为 my_program 的程序:

gdb my_program

1.3 设置程序的参数

在 GDB 中,你可以使用 set args 来为程序设置命令行参数。例如:

set args 张三 西施 我是一只傻傻鸟

这将模拟命令行参数传递给程序。假设程序的命令行参数使用 argcargv 获取,执行程序时,它将使用这些参数。

1.4 设置断点

使用 break 或简称 b 命令设置断点。例如:

break 20

该命令会在程序的第 20 行设置一个断点。你也可以为函数名设置断点:

break main

1.5 启动程序并运行至断点

使用 run 或简称 r 来启动程序,程序会在设置的断点处停止:

run

如果程序没有遇到断点,它会直接运行至结束。

1.6 执行一步

使用 step 或简称 s 命令可以逐步执行当前语句,并且进入函数内部:

step

如果你只是希望跳过当前函数调用而不进入函数体,可以使用 next 或简称 n

1.7 打印变量值

要查看变量的当前值,可以使用 print 或简称 p 命令:

print variable_name

例如,查看变量 i 的值:

print i

1.8 查看函数调用栈

使用 bt(backtrace)命令查看当前的函数调用栈:

bt

2. GDB 调试 Core 文件

当程序崩溃时,系统可能会生成一个 core 文件,包含了程序的内存快照和崩溃时的状态信息。使用 GDB 可以帮助分析这些文件。

2.1 生成 Core 文件

在 Linux 中,可以通过 ulimit 命令设置生成 core 文件的最大大小:

ulimit -c unlimited

这将允许程序在崩溃时生成 core 文件。运行程序并发生崩溃后,可以使用以下命令:

gdb 程序名 core 文件名

例如,调试一个名为 my_program 的程序和它的 core 文件:

gdb my_program core

2.2 使用 GDB 调试 Core 文件

调试 core 文件时,首先可以使用 bt 命令查看函数调用栈,以便了解崩溃发生的位置:

bt

你还可以使用 print 命令查看崩溃时的变量值,以进一步分析问题所在。

3. GDB 调试正在运行的程序

GDB 也可以用于调试正在运行的程序。你可以附加到一个已经启动的进程,并实时调试它。

在这里插入图片描述

3.1 附加到正在运行的进程

使用 attach 命令将 GDB 附加到一个正在运行的进程。例如,如果进程 ID 为 1234:

gdb
(gdb) attach 1234

这将使 GDB 附加到进程,接下来可以设置断点、查看变量等。

3.2 在进程中设置断点

在调试正在运行的程序时,你可以在进程中的特定位置设置断点。例如:

(gdb) break main

这会在程序的 main 函数处设置断点。

3.3 恢复程序执行

使用 continue 或简称 c 命令,可以恢复程序的执行,直到遇到下一个断点为止:

continue

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

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

相关文章

微服务网关,如何选择?

什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…

Spring 6 第3章——容器:IoC

一、IoC容器 IoC是Inversion of Control的简写,翻译为“控制反转”.它不是一门技术,而是一种设计思想 Spring通过IoC容器来管理(1)所有Java对象的实例化和初始化,(2)控制对象与对象之间的依赖…

Docker:基于自制openjdk8镜像 or 官方openjdk8镜像,制作tomcat镜像

一、制作openjdk8基础镜像【基于自定义alpine-3.18.0:v1 】 docker pull maven:3.5.0-jdk-8-alpine 78.56 MB https://hub.docker.com/_/maven/tagspage8&namealpine openjdk二进制下载地址 https://blog.csdn.net/fenglllle/article/details/124786948 https://adoptope…

数据结构漫游记:动态实现栈(stack)

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

鸿蒙系统 将工程HarmonyOS变成OpenHarmony

DevEco Studio软件创建工程后需要修改两个地方: 修改第二个build-profile.json5文件 将原先内容: {"app": {"signingConfigs": [],"products": [{"name": "default","signingConfig": &q…

MySQL 事务及MVCC机制详解

目录 什么是事务 事务的隔离级别 数据库并发的三种场景 读-写 什么是事务 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们…

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(3.纯python的实惠版)

前情: 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)-CSDN博客 将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(2.换掉付费的Event Hubs)-CSDN博客 python脚本实现 厉害的…

什么是三高架构?

大家好,我是锋哥。今天分享关于【什么是三高架构?】面试题。希望对大家有帮助; 什么是三高架构? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 “三高架构”通常是指高可用性(High Availability)、高性能&#xff…

[微服务]注册中心优化

环境隔离 企业实际开发中,往往会搭建多个运行环境,例如: 开发环境测试环境预发布环境生产环境 这些不同环境之间的服务和数据之间需要隔离。 还有的企业中,会开发多个项目,共享nacos集群。此时,这些项目…

uniapp——App 监听下载文件状态,打开文件(三)

5 实现下载文件并打开 这里演示,导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0? 相关Api: downloader DEMO 提示: 请求方式支持:GET、POST;POST 方式需要…

地图:nuxt3高德地图简单使用 / nuxt2 + amap

一、官方网站 JS API 安全密钥使用-基础-进阶教程-地图 JS API 2.0 | 高德地图API 二、使用 2.1、创建应用 2.2、添加key&#xff0c;得到key值 2.3、nuxt3项目 引入amap 2.4、pages/map.vue <template><div class"container"><div id"map-co…

Java面试专题——面向对象

面向过程和面向对象的区别 面向过程&#xff1a;当事件比较简单的时候&#xff0c;利用面向过程&#xff0c;注重的是事件的具体的步骤/过程&#xff0c;注重的是过程中的具体的行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。 面向对象&#xff1a;注重找“参与者…

Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配

文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…

VIVADO ILA IP进阶使用之任意设置ILA的采样频率

VIVADO ILA IP进阶使用之任意设置ILA的采样频率 VIVADO ILA IP和VIO IP结合使用任意设置ILA的采样频率 目录 前言 一、VIO IP的配置 二、ILA IP的配置 三、测试代码 四、测试结果 总结 前言 VIVADO中编写完程序上板测试时经常会用到viavdo自带的ILA逻辑分析仪IP核&#x…

【机器学习实战入门】使用LSTM机器学习预测股票价格

机器学习在股票价格预测中有重要的应用。在这个机器学习项目中&#xff0c;我们将讨论如何预测股票的收益。这是一个非常复杂的任务&#xff0c;充满了不确定性。我们将会把这个项目分成两部分进行开发&#xff1a; 首先&#xff0c;我们将学习如何使用 LSTM 神经网络预测股票…

DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition 中的空洞自注意力机制

空洞自注意力机制 文章目录 摘要1. 模型解释1.1. 滑动窗口扩张注意力1.2. 多尺度扩张注意力 2. 代码3. 流程图3.1. MultiDilatelocalAttention3.2. DilateAttention3.3. MLP 摘要 本文针对DilateFormer中的空洞自注意力机制原理和代码进行详细介绍&#xff0c;最后通过流程图梳…

大模型GUI系列论文阅读 DAY2续:《一个具备规划、长上下文理解和程序合成能力的真实世界Web代理》

摘要 预训练的大语言模型&#xff08;LLMs&#xff09;近年来在自主网页自动化方面实现了更好的泛化能力和样本效率。然而&#xff0c;在真实世界的网站上&#xff0c;其性能仍然受到以下问题的影响&#xff1a;(1) 开放领域的复杂性&#xff0c;(2) 有限的上下文长度&#xff…

Qt按钮美化教程

前言 Qt按钮美化主要有三种方式&#xff1a;QSS、属性和自绘 QSS 字体大小 font-size: 18px;文字颜色 color: white;背景颜色 background-color: rgb(10,88,163); 按钮边框 border: 2px solid rgb(114,188,51);文字对齐 text-align: left;左侧内边距 padding-left: 10…

云IDE:开启软件开发的未来篇章

敖行客一直致力于将整个研发协作流程线上化&#xff0c;从而打破物理环境依赖&#xff0c;让研发组织模式更加灵活、自由且高效&#xff0c;今天就来聊聊AT Work&#xff08;一站式研发协作平台&#xff09;的重要组成部分-云IDE。 在科技领域&#xff0c;历史常常是未来的风向…

AI agent 在 6G 网络应用,无人机群控场景

AI agent 在 6G 网络应用,无人机群控场景 随着 6G 时代的临近,融合人工智能成为关键趋势。借鉴 IT 行业 AI Agent 应用范式,提出 6G AI Agent 技术框架,包含多模型融合、定制化 Agent 和插件式环境交互理念,构建了涵盖四层结构的框架。通过各层协同实现自主环境感知等能力…