linux下使用gdb运行程序,查看程序崩溃原因

1.什么是gdb?

gdb 是 GNU Debugger 的缩写,是一个功能强大的用于调试程序的开源调试器工具。它可以帮助开发人员诊断和解决程序中的错误、跟踪程序执行过程、查看变量的值等。gdb 支持多种编程语言,包括 C、C++、Objective-C、Fortran 等,并可用于多种操作系统,如 Linux、Unix、Windows 等。

通过 gbd,开发人员可以进行如下操作:

  1. 设置断点:可以在程序中设置断点,以便在执行到特定代码行时暂停程序的执行,方便查看程序状态。

  2. 单步执行:可以逐行执行程序,并查看每一步的执行情况,帮助定位错误。

  3. 查看变量:可以查看程序中各个变量的值,帮助分析程序状态。

  4. 堆栈跟踪:可以查看函数调用栈,帮助理解程序的执行流程。

  5. 内存管理:可以查看和修改程序的内存内容,有助于发现内存相关的问题。

总的来说,gdb 是一款功能丰富的调试工具,适用于各种编程语言和操作系统,是开发人员在调试程序时的重要利器。通过使用 gdb,开发人员可以更快速地定位和解决程序中的问题,提高开发效率。

2.为什么要用gdb?

因为我使用的是QT开发程序,在开发机上可以不用gdb调试,用QT断点调试就行了,但是

程序发布后,别人的机子是没有开发环境的,这个时候别人用程序崩溃了?怎么办?怎么查找原因?常见的有一下方法:

  1. 查看错误信息:程序崩溃时通常会输出错误信息或者崩溃日志。您可以查看这些信息,通常会包含有关错误发生的位置和原因。这可以帮助您快速定位问题所在。

  2. 日志文件:有些程序会将运行时的日志记录在特定的日志文件中。查看这些日志文件可以帮助您了解程序运行过程中的详细信息,从而定位问题。

  3. 使用系统工具:操作系统通常提供一些工具来帮助诊断程序问题,比如在 Linux 系统中,您可以使用 dmesg 命令查看系统日志,或者使用 gdb 进行程序调试。

  4. 重现问题:尝试重现程序崩溃的步骤,看看是不是可以稳定地触发问题。这有助于确定问题发生的条件和步骤。

  5. 编译调试信息:如果可能的话,可以尝试在开发环境中编译程序时加入调试信息,然后将可执行文件拷贝到没有开发环境的电脑上运行。这样在程序崩溃时,可以使用调试器(如 gdb)来分析问题。

  6. 查看内存情况:程序崩溃有可能是因为内存相关的问题,比如内存泄漏或者访问非法内存。您可以使用内存检测工具(如 Valgrind)来检查程序的内存使用情况。

最常见的就是使用日志,根据最后的输出位置来定位崩溃点的大致方位,但是如果程序比较复杂,有很多个可疑的地方,还是无法很棘手,不好确定,如下所示,只知道获取到了用户信息后就崩溃了,访问了非法的内存,其他原因一无所知

所以除了日志,还得需要辅助工具来确认具体的崩溃点,linux下用gdb就行了,他会在程序崩溃时,输出具体的崩溃日志信息,哪个函数,哪个类,什么原因导致的

3. linux下怎么使用gdb?

我用最简单的方法使用,每台linux,装机就自带了gdb,所以直接用就行了

1. 用gdb运行程序

终端输入:gdb 要运行的程序名称

如下所示,运行后,会进入gdb控制界面,你可以输入指令进行断点调试,直接运行程序等

因为我要直接找崩溃的点,我就直接运行了,这样运行不会影响程序,和正常运行程序一样,直到程序崩溃或者退出

2. 输入直接运行程序的指令

输入:run,然后回车运行程序

3.正常使用程序,直到程序崩溃了卡住

程序卡住后,去看终端gdb输出

然后回车,你会看到一些崩溃原因的输出信息,然后等待你的下一步指令

根据崩溃信息:Thread 41 "Thread (pooled)" received signal SIGSEGV, Segmentation fault.

可以知道是由于内存引起的崩溃,内存引起的崩溃有一下原因:

  1. 内存泄漏(Memory Leaks)

    • 内存泄漏是指程序在动态分配内存后,没有正确释放该内存,导致系统中的可用内存不断减少,最终可能导致程序崩溃。频繁的内存分配而不释放还会导致程序性能下降。
  2. 野指针(Dangling Pointers)

    • 当程序试图访问已经释放的内存,或者已经超出作用域的内存时,就会产生野指针。使用野指针访问内存会导致未定义行为,可能导致程序崩溃。
  3. 访问非法内存(Access Violation)

    • 尝试访问未分配或者越界的内存空间会导致访问非法内存。这会触发操作系统的保护机制,通常会导致程序崩溃。
  4. 内存重叠(Memory Overlapping)

    • 当两个或多个动态分配的内存块发生重叠时,可能会导致未定义行为,包括程序崩溃。
  5. 栈溢出(Stack Overflow)

    • 当程序递归调用层次过深或者在栈上分配过多的局部变量时,栈空间可能会耗尽,导致栈溢出,从而导致程序崩溃。

 在根据崩溃信息:0x00007ffff5fc991c in QString::operator=(QString const&) () from

可以知道是=赋值时崩溃的,但具体是哪个地方的赋值引起的,还不知道,需要更多的崩溃信息

4. 输入指令查看详细的崩溃信息

4.1 输入bt

在 GDB(GNU调试器)中,输入 bt 命令可以打印出当前的函数调用栈(backtrace),也就是显示当前程序执行过程中的函数调用关系。这个函数调用栈显示了从程序入口到当前位置之间所有的函数调用关系,通常用于调试程序时查看导致程序崩溃或异常的函数调用路径。

bt 命令会显示函数调用栈的详细信息,包括每个调用帧(frame)的函数名、源文件名、行号等信息。通过查看函数调用栈,开发人员可以了解程序崩溃时各个函数之间的调用关系,从而更好地定位问题所在。

所以我一般用bt就够了,在终端输入:bt

可以看到程序崩溃时各个函数之间的调用关系,结合你的程序源代码,基本可以锁定崩溃点了

我的崩溃点在这里,查询组织机构时,但是为空,赋值时崩溃的

把上面这个输出的日志信息和这个崩溃信息函数调用图给研发人员看,即可

4.2 循环输入ret

输入ret, 在输入y确认,可以选择让当前的栈帧立即返回,立即返回当前的栈帧,重复输入,可以返回在返回,直到输出了看不懂的输出

知道大概原因后,输入n 退出回溯当前的栈帧

4.3 其他指令

在 GDB 中,有一些其他常用的指令可以帮助您查看程序崩溃的原因、位置以及相关信息。以下是一些与调试程序崩溃相关的 GDB 指令:

  1. info registers:显示当前 CPU 寄存器的值,帮助您了解程序崩溃时寄存器状态,有助于定位问题。

  2. info frame:显示当前帧的信息,包括函数参数、局部变量等,帮助您了解当前函数的上下文信息。

  3. info locals:显示当前函数的局部变量及其值,有助于您查看程序崩溃时局部变量的状态。

  4. info breakpoints:显示当前设置的断点信息,可以查看程序中所有已设置的断点。

  5. info line:显示当前执行代码行的源代码位置,帮助您了解程序崩溃时所在的源代码位置。

  6. info stack:显示当前线程的调用栈信息,包括函数调用顺序和参数值,有助于定位程序崩溃时的函数调用路径。

  7. info threads:显示当前程序的所有线程信息,可以查看各个线程的状态和调用栈信息,帮助您分析多线程程序的崩溃情况。

  8. thread apply all bt:显示所有线程的函数调用栈信息,帮助您同时查看多个线程的调用栈,有助于分析多线程程序的崩溃情况。

5. 退出gdb

输出quit,回车,在输入y确认即可退出

4.没有运行gdb的情况下,怎么查看崩溃信息

查看core dump 文件

core dump 文件是在程序发生严重错误(如段错误、内存访问错误等)并终止时,操作系统生成的包含程序内存状态的文件。这个文件可以帮助开发人员在程序崩溃时分析问题并进行调试。

要生成 core dump 文件,您可以按照以下步骤进行:

  1. 确保核心转储(core dump)被启用:

    在大多数 Unix/Linux 系统中,默认情况下核心转储功能可能是禁用的。您可以通过设置以下命令来启用核心转储:

    ulimit -c unlimited

    这将允许您的程序生成核心转储文件。如果您想要将核心转储文件存放在特定目录,可以使用以下命令:

    echo "/path/to/dumpfiles/core-%e.%p" > /proc/sys/kernel/core_pattern

    并假设您的可执行文件为 my_program,假设您希望在 /var/coredumps/ 目录下存储 core dump 文件,那么您可以设置模式为:

    echo "/var/coredumps/core-%e.%p" > /proc/sys/kernel/core_pattern

    这样,当 my_program 发生崩溃时,系统将生成一个 core dump 文件,并将其命名为类似于 core-my_program.12345 的文件,其中 12345 是进程的 ID。

    这个设置将使系统在发生崩溃时将 core dump 文件保存在 /var/coredumps/ 目录下,并根据可执行文件的名称和进程 ID 命名生成的文件

  2. 运行程序并导致程序崩溃:

    现在,当您运行程序并导致程序崩溃时,操作系统将生成一个包含程序崩溃时内存状态的 core dump 文件。

  3. 查看 core dump 文件:

    您可以使用 GDB 来查看 core dump 文件,如之前所述的步骤:
    如 gdb ./test -c core 
    格式:gdb <your_program_executable> -c <core_dump_file>

  4. 在 GDB 中分析 core dump 文件:

    一旦您加载了 core dump 文件,您可以使用 GDB 的各种命令来分析程序在崩溃时的状态,包括查看堆栈回溯、寄存器状态等。

注意,生成核心转储文件可能会占用大量磁盘空间,因此请根据需要进行清理

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

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

相关文章

鸿蒙arkts怎么打印一个方法的调用堆栈

做鸿蒙开发的时候&#xff0c;也想看一下一个方法到底是哪里调用的&#xff0c;工程太大&#xff0c;断点太麻烦&#xff0c;可以加堆栈日志。 在你的方法中加上这两句&#xff0c;就可以跟到堆栈日志 let err new Error() console.log(>>>>>>err.stack) …

IDE如何安装插件实现Go to Definition

项目背景 框架&#xff1a;Cucumber Cypress 语言&#xff1a;Javascript IDE&#xff1a;vscode 需求 项目根目录cypress-automation的cypress/integration是测试用例的存放路径&#xff0c;按照不同模块不同功能创建了很多子目录&#xff0c;cucumber测试用例.feature文…

如何通过 Windows 自带的启动管理功能优化电脑启动程序

在日常使用电脑的过程中&#xff0c;您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”&#xff0c;它们可以在系统启动时自动加载并开始运行&#xff0c;有时甚至在后台默默工作。虽然一些启动项可能是必要的&#xff08;如杀毒软件&#xff09;&a…

探索自然语言处理奥秘(NLP)

摘要 自然语言处理&#xff08;NLP&#xff09;是人工智能领域的一个重要分支&#xff0c;它致力于使计算机能够理解、解释和生成人类语言。这项技术让机器能够阅读文本、听懂语音&#xff0c;并与人类进行基本的对话交流。 通俗理解 自然语言处理&#xff08;NLP&#xff09…

# issue 8 TCP内部原理和UDP编程

TCP 通信三大步骤&#xff1a; 1 三次握手建立连接; 2 开始通信&#xff0c;进行数据交换; 3 四次挥手断开连接&#xff1b; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好&#xff0c;套接字B。我这儿有数据要传给你&#xff0c;建立连接吧。" 【第二次…

力扣--543.二叉树的直径

题目 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 /** Definition for a binary tree node.public…

在ensp进行IS-IS网络架构配置

一、实验目的 1. 理解IS-IS协议的工作原理 2. 熟练ensp路由连接配置 二、实验要求 需求&#xff1a; 路由器可以互相ping通 实验设备&#xff1a; 路由器router6台 使用ensp搭建实验坏境&#xff0c;结构如图所示 三、实验内容 R1 u t m sys undo info en sys R1 #设…

挑战用React封装100个组件【010】

Hello&#xff0c;大家好&#xff0c;今天我挑战的组件是这样的&#xff01; 今天这个组件是一个打卡成功&#xff0c;或者获得徽章后的组件。点击按钮后&#xff0c;会弹出礼花。项目中的勋章是我通过AI生成的&#xff0c;还是很厉害的哈&#xff01;稍微抠图直接使用。最后面…

Mybatis-Plus的主要API

一、实体类操作相关API BaseMapper<T>接口 功能&#xff1a;这是 MyBatis - Plus 为每个实体类对应的 Mapper 接口提供的基础接口。它提供了一系列基本的 CRUD&#xff08;增删改查&#xff09;操作方法。例如insert(T entity)方法用于插入一条记录&#xff0c;d…

C++类与对象(二)

一、默认成员函数 class A{}; 像上面一样&#xff0c;一个什么都没有的类叫做空类&#xff0c;但是这个什么都没有并不是真正的什么都没有&#xff0c;只是我们看不见&#xff0c;空类里面其实是有6个默认成员函数的&#xff0c;当我们在类里面什么都不写的时候&#xff0c;编译…

数据结构与算法-03链表-03

递归与迭代 由一个问题引出 假设我们要计算 一个正整数的阶乘, N! 。 从数学上看 1&#xff01; 1 2&#xff01; 2 x 1 3! 3 x 2 x 1 4! 4 x 3 x 2 x 1 5! 5 x 4 x 3 x 2 x 1 : n! n x (n-1) x (n-2) x (n-3) x ... 1我们推出一般公式 f(1) 1 f(n) n * f(n-1…

spring6:2入门

spring6&#xff1a;2入门 目录 spring6&#xff1a;2入门2.1、环境要求2.2、构建模块2.3、程序开发2.3.1、引入依赖2.3.2、创建java类2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序分析2.5、启用Log4j2日志框架2.5.1、Log4j2日志概述2.5.2、引入Log…

汽车IVI中控开发入门及进阶(三十五):架构QML App Architecture Best Practices

在Qt/QML工程的架构中,架构很重要,虽然本身它有分层,比如QML调用资源文件(图片等)显示GUI界面,后面的CPP文件实现界面逻辑,但是这个分类还有点粗。在实际开发中,界面逻辑也就是基于类cpp的实现,也开始使用各种面向对象的设计模式,实现更加优秀的开发架构,这点尤其在…

import是如何“占领满屏“

import是如何“占领满屏“的&#xff1f; 《拒绝使用模块重导&#xff08;Re-export&#xff09;》 模块重导是一种通用的技术。在腾讯、字节、阿里等各大厂的组件库中都有大量使用。 如&#xff1a;字节的arco-design组件库中的组件&#xff1a;github.com/arco-design… …

(软件测试文档大全)测试计划,测试报告,测试方案,压力测试报告,性能测试,等保测评,安全扫描测试,日常运维检查测试,功能测试等全下载

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.2. 测试环境 4.2.…

抽象工厂模式的理解和实践

在软件开发中&#xff0c;设计模式是解决常见问题的最佳实践。抽象工厂模式是一种创建型设计模式&#xff0c;提供了一种创建一系列相关或相互依赖对象的接口&#xff0c;而无需指定它们的具体类。本文将详细解释抽象工厂模式的概念、结构、优点、缺点&#xff0c;并通过Java代…

算法日记(2024.12.05)

1.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1…

【知识点】图与图论入门

何为图论 见名知意&#xff0c;图论 (Graph Theory) 就是研究 图 (Graph) 的数学理论和方法。图是一种抽象的数据结构&#xff0c;由 节点 (Node) 和 连接这些节点的 边 (Edge) 组成。图论在计算机科学、网络分析、物流、社会网络分析等领域有广泛的应用。 如下&#xff0c;这…

【书生大模型实战营】Linux 基础知识-L0G1000

前言&#xff1a;书生大模型实战营是上海人工智能实验室开展的大模型系列实践活动&#xff0c;提供免费算力平台&#xff0c;学员通过闯关式任务&#xff0c;可获得免费算力和存储&#xff0c;助力项目实践。本期是第4期&#xff0c;时间从十一月份开始&#xff0c;持续到十二月…

【软件安全】软件安全设计规范,软件系统安全设计制度(Word原件)

1.1安全建设原则 1.2 安全管理体系 1.3 安全管理规范 1.4 数据安全保障措施 1.4.1 数据库安全保障 1.4.2 操作系统安全保障 1.4.3 病毒防治 1.5安全保障措施 1.5.1实名认证保障 1.5.2 接口安全保障 1.5.3 加密传输保障 1.5.4终端安全保障 软件全面文档清单涵盖以下核心内容&a…