gdb调试使用记录

news2024/9/21 22:40:55

使用 GDB(GNU Debugger)进行问题排查是非常有效的。且可以通过core文件进行排查bug,core文件是程序异常崩溃的时候(段错误,非法指令等),系统自动生成的core文件。用户可以通过core文件配合gdb调试命令,调试程序异常崩溃的原因,修复相应的bug。core文件生成需要通过ulimit -c命令来查看和配置,当显示为0时,表示系统不会生成core文件,这个时候我们需要配置相应的环境,使系统可以在程序异常崩溃的时候,生成core文件。

可通过如下命令设置core文件大小和输出位置

ulimit -c unlimited

临时生效则是使用echo命令将想要的格式写入到该文件中,比如

echo ‘/usr/core -%e -%p -%t' > /proc/sys/kernel/core_pattern

  • /usr/core: 指定核心转储文件的存储目录。
  • -%e: 代表崩溃程序的可执行文件名。
  • -%p: 代表崩溃进程的进程ID。
  • -%t: 代表崩溃发生的时间戳。

下面记录下GDB的简单排查问题实用

1. 启动 GDB

在终端中,输入以下命令来启动 GDB:

gdb ./your_program

2. 设置断点

你可以在程序的某个函数或者行号设置断点:

break main      # 在 main 函数处设置断点
break filename.c:line_number  # 在特定文件的特定行设置断点

3. 运行程序

输入命令开始运行程序:

run

4. 程序暂停

当程序运行到断点处时,会暂停,显示当前状态。

5. 检查变量

使用以下命令查看变量的值:

print variable_name  # 打印变量的值

6. 单步调试

逐步执行代码:

  • next:执行下一行(不进入函数内部)
  • step:执行下一行(进入函数内部)

7. 继续执行

如果需要继续执行到下一个断点,可以使用:

continue

8. 查看调用栈

如果程序崩溃,可以查看调用栈:

backtrace

9. 退出 GDB

使用以下命令退出 GDB:

quit

10. 其他有用命令

  • list:查看当前执行代码附近的源代码。
  • info locals:查看当前函数中的所有局部变量。
  • watch variable_name:监视某个变量的变化。

下面是使用 GDB 调试的示例步骤:

编译程序时加上调试信息:

gcc -g -o my_program my_program.c

启动 GDB:

gdb ./my_program

设置断点和运行:

break main
run
使用 next 或 step 逐步调试,查看变量值。

使用 GDB 排查 core 文件的基本步骤如下:

准备环境: 确保你的程序在编译时使用了调试信息。可以通过添加 -g 标志来编译你的代码,例如:

gcc -g -o my_program my_program.c

生成 Core 文件

运行程序并使其崩溃,通常可以通过设置环境变量 ulimit 来确保生成 core 文件:

ulimit -c unlimited
./my_program

使用 GDB 加载 Core 文件: 使用 GDB 加载你的程序和生成的 core 文件:

gdb ./my_program core

查看崩溃信息: 在 GDB 中,你可以使用以下命令来查看崩溃时的堆栈信息:

(gdb) bt

检查变量值: 你可以查看特定变量的值:

(gdb) print variable_name

导航源代码: 使用 list 命令查看崩溃位置附近的代码:

设置断点: 你可以在特定函数或行上设置断点,以便进一步调试:

(gdb) break function_name

继续执行: 如果想从某个点继续执行,可以使用:

(gdb) continue

退出 GDB: 调试完成后,使用以下命令退出:

(gdb) quit

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

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

相关文章

Redis数据结构之String字符串

二.String字符串 redis中的所有key都是字符串类型,只不过是value类型有差异。 redis中的字符串,直接就是按照二进制的方式存储的(不会做任何的编码转换(就好像mysql,它默认的字符集是拉丁文,插入中文就会…

Linux 基础IO 2

读取与写入 read与fread 在基础IO 1中我们学会了open和fopen的函数这两个函数是用于为进程打开文件也可以理解为为进程和文件建立了一个链接使其可以交互。那我们建立号链接之后肯定还是需要对文件进行操作,现在我们先来了解读取操作。 read: 这是一…

Leetcode面试经典150题-94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入:root [1] 输出&am…

SOMEIP_ETS_120: SD_Initial_Events_after_Subscribe_with_alternate_IPs

测试目的: 验证DUT在接收到Tester的SubscribeEventgroup消息后,能够向Tester指定的IP地址和端口发送SubscribeEventgroupAck确认消息以及对应的初始化字段。 描述 本测试用例旨在确保DUT能够正确处理SubscribeEventgroup消息,并按照消息中…

基于SpringBoot+Vue的健身房管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

自动化直播的未来:2024年必试的10款自动直播App曝光,教你轻松玩转直播!

自动化直播的未来:2024年必试的10款自动直播App曝光,教你轻松玩转直播! 随着人工智能技术的飞速发展,自动化直播已经成为当下最热门的趋势之一。2024年,众多创新的AI自动直播App如雨后春笋般涌现,它们不仅…

IO流中的异常捕获

Java简化 接口AutoCloseable

unity3d入门教程九

unity3d入门教程九 20.2播放音频20.3在代码中播放21.1延时调用21.2invoke API21.3消息调用22.1交互界面22.2添加canvas22.3canavas的位置22.4添加text 这里给一个资源网站,可以部分免费下载,音乐和音效超多,支持检索 爱给网 https://www.aige…

【Delphi】创建应用程序和 LiveBindings示例(FMX)

一、创建一个FMX程序 界面上放置上如下3个控件:TProgressBar1, TArcDial1,TTrackBar1。 二、打开LiveBindings Designer 设计器 三、在 LiveBindings Designer 中,您的绑定图只包含对象,您可以将它们连接起来。 四、在设计器中,在…

idea 恢复 pom 文件呈现灰色并带删除线

今天在 idea 中导入别人的项目时发现有几个 pom 文件是灰色的并带删除线。 可以用以下方式解决: 打开file - settings - build,execution,deployment - Build Tools - Maven - Ignored Files 把 pom.xml 前面的复选框去掉,去掉之后,点击 appl…

Kerberos自我总结Kerberos自我总结

1、协议原理与漏洞产生 1.1 kerberos Kerberos协议是一种基于票据Ticket的认证方式,它由三个角色组成,分别是客户端Client、服务端Server和秘钥分发中心KDC。 协议中的交互分为六步,为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP …

【Linux】进程地址空间和进程调度队列

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

C++——string的了解和使用

目录 引言 为什么要学习string 1.C语言中的字符串 2.C中的字符串 auto和范围for 1.auto 1.1 auto的介绍 1.2 注意事项 2.范围for 标准库中的string类 1.string类的迭代器 1.1 begin()与end()函数 1.2 rbegin()与rend()函数 2.string类的初始化和销毁 3.string类…

【线程】线程的控制

本文重点:理解线程控制的接口 前言 内核中是没有很明确线程的概念的,只有轻量级进程的概念,不会提供直接给我们线程的系统调用,而会给我们提供轻量级进程的系统调用。我们用户是需要线程的接口的,在应用层&#xff0…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda (总结全部的精华) 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找,学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

智能自行车码表:基于2605C语音芯片的创新开发方案

一、开发背景 随着科技的飞速发展和人们对健康生活的追求,自行车骑行已成为一种广受欢迎的绿色出行方式。智能自行车码表作为骑行者的得力助手,不仅记录骑行数据,还逐渐融入了更多智能化功能。然而,传统码表在语音提示、多语种支持…

Science Robotic 内在触觉实现直观的物理人机交互

触觉传感器和电子皮肤是为机器人提供物理交互感的常见设备,但当用于机器人的大面积覆盖时,它们会变得复杂且昂贵。德国宇航中心近期发表的Science Robotics研究工作,使用内部高分辨率关节力扭矩传感器,在机械臂中实现了固有的全身…

linux网络-----传输层

前言 一.传输层: 数据要交接应用层先通过传输层(给哪个程序发数据) 传输层作用:负责数据能够从发送端传输接收端。对于应用层来说有许多服务,传输层怎么知道把数据发给那个应用服务? 这时就有了端口号&am…

BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?

1.说明 1.1 背景 无意中看到PCA9545(switch芯片)后面有设备,但是PCA9545设备本身是连接到物理设备i2c上的,然而扫描该物理i2c bus,却找不到该设备。此篇文章主要找一下该原因的。 1.2 参考代码 当前使用的是ast2600芯片,可参考…

Mudslide

作者未提供代码