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.xdnf.cn/news/34674.html

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

相关文章

代发考试战报:12月近几日通过,题库已经更新至12月5号

代发考试战报&#xff1a;12月近几日通过&#xff0c;题库已经更新至12月5号&#xff0c;考试大约会遇到几个新题&#xff0c;就算遇到的新题全错&#xff0c;也不影响考试通过&#xff0c;HCIA-PM 12月2号上海通过&#xff0c;售前L3 H19-435 HCSP-Storage 存储 上海通过&…

使用Kubernetes部署MySQL+WordPress

目录 前提条件 部署MySQL和WordPress 编写yaml文件 应用yaml文件 存在问题及解决方案 创建PV(持久化卷) 创建一个PVC(持久化卷声明) 部署添加PVC 查看PV对应的主机存储 删除资源 查看资源 删除deployment和service 查看主机数据 删除PVC和PV 删除主机数据 前提条…

深入解析 Nginx:基础介绍到原理分析及案例实践

引言 Nginx&#xff08;“Engine-X”&#xff09;是一个高性能的 HTTP 和反向代理服务器&#xff0c;广泛应用于 Web 服务、负载均衡、API 网关、反向代理、静态资源服务器等多种场景。由于其高效的性能、低资源消耗和灵活的配置&#xff0c;Nginx 成为众多互联网公司、企业以…

Apache HTTPD多后缀解析漏洞

进入靶场 上来就是一个文件上传的功能 经过尝试&#xff0c;发现只有jpg&#xff0c;png&#xff0c;gif文件能上传上去&#xff0c;而题目又说了&#xff0c;这个是Apache的中间件&#xff0c;Apache文件解析漏洞涉及到一个Apache解析文件的特性&#xff0c;Apache默认一个文…

JavaScript(二)

1.JavaScript 操作符 2.JavaScript 流程控制 3.JavaScript 循环 4.JavaScript 字符串方法 5.JavaScript 数组方法 知识点一 操作符 变量声明 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Ti…

单链表---合并两个链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 struct ListNode {int val;struct ListNode* next; }; w 方法一---不使用哨兵位 我们创建一个新链表用于合并两个升序链表&#xff0c; 将两个链表中最小的结点依次尾插到…

2024-12月akamai_2.0-sensor-data之cookie反爬分析详细教程(上)

目录 一、网址及目标数据二、分析接口反爬点&#xff08;akamai执行过程&#xff09;三、逆向分析参数sensor_data四、扣js算法代码加密详细步骤 一、网址及目标数据 文章原文 1、网站&#xff1a; https://www.dhl.com/cn-zh/home/tracking/tracking-supply-chain.html?sub…

【Docker】如何在Docker中配置防火墙规则?

Docker本身并不直接管理防火墙规则&#xff1b;它依赖于主机系统的防火墙设置。不过&#xff0c;Docker在启动容器时会自动配置一些iptables规则来管理容器网络流量。如果你需要更细粒度地控制进出容器的流量&#xff0c;你需要在主机系统上配置防火墙规则。以下是如何在Linux主…

煤矿 35kV 变电站 3 套巡检机器人 “上岗”,力破供电瓶颈

近日&#xff0c;杭州旗晟智能科技与甘肃某变电站配电室的三套智能巡检机器人线下测试顺利完成&#xff0c;并成功交付使用&#xff0c;这为电力运维工作注入了全新的活力与强大的技术支撑。 一、项目背景 甘肃某变电站总建筑面积1098平方米的变电站集变电、配电、监控等多功能…

[创业之路-170]:《BLM战略规划》- 领导力 - 战略制定 - 洞察力 (战略能力中最最核心的能力) - 市场洞察 -2- 看客户-B2B客户分析

目录 一、看客户概述 一、看客户的核心意义 二、看客户的具体内容 三、看客户的实践方法 四、看客户的重要性 二、2B客户的研究方法&#xff1a;研究客户的决策流程 2.1 客户的战略&#xff1a;财务、市场、运营组织 1、研究客户的决策流程 2、研究客户的战略 3、研究…

langgraph 多智能体 Multi-agent supervisor

1. 工具定义 1.1网络搜索工具 from typing import Annotated import os from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.tools import tool from langchain_experimental.utilities import PythonREPLos.environ["TAVIL…

前缀和(七) 连续数组中最长的01个数相等序列

525. 连续数组 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或…

【硬件测试】基于FPGA的64QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 64QAM调制解调系统的设计 2.2 信号解调 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章: 《基于FPGA的64QAM基带通信系统,包含testbench,高斯…

BUUCTF:misc刷题记录2(会持续更新的)

乌镇峰会种图 打开之后什么也没有发现 用010找到flag flag{97314e7864a8f62627b26f3f998c37f1} wireshark 解压后是个压缩包&#xff0c;用wirshark打开。 根据题目信息&#xff0c;我们可以在wirshark中去寻找密码 在这里进行过滤http.request.methodPOST 在这里的ffb7567a1…

elasticSearch(一):elasticSearch介绍

一、搜索引擎 搜索引擎的核心目的是帮助用户以最小的成本才海量数据中找到最想要的结果。糟糕的搜索引擎往往会所问非所答&#xff0c;用户查了半天也得不到自己想要的&#xff0c;好的搜索引擎往往第一页就是用户最想要的结果。而目前判断搜索引擎好坏一般是从召回率、精确率…

python解析各城市历史天气数据

1 背景介绍 python解析各城市历史天气数据 2 基本思路 获取原始数据&#xff0c;解析&#xff0c;然后保存到excel表格里面。 以浙江省杭州市西湖区2016年9月到2017年4月的 历史天气数据为例&#xff0c;最终成果如下&#xff1a; 3 核心代码 对于数据比较少时&#xff…

【并集查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

组件中的生命周期

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了Flutter中如何使用三方包相关的内容,本章回中将介绍Widget的生命周期.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 本章回中介绍的生命周期是指Widget从创建到结果的整个过程,这里提到的Widget是一个泛…

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…

Shopee大卖选品策略揭秘:印尼市场选品与成本分析案例

东南亚电商市场愈发成熟&#xff0c;越来越多做跨境的卖家转向本土。但对于“本土化选品运营”这个问题还相当疑惑&#xff01;看别人本土店销量飞起&#xff0c;自己却还在就纠结做啥能挣钱&#xff1f; 别急&#xff0c;今天EasyBoss根据之前合作的Shopee大卖分享的经验&…