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

使用gdb来debug程序并查找Segmentation fault原因

GDB 调试

    • 前言
    • GDB基础用法
      • 1.启动及退出调试
      • 2.设置参数
      • 3.执行程序
      • 4.流程控制
      • 5.设置断点
      • 6.输出信息
      • 7.查看栈帧
      • 8.info命令
      • 9.显示源码
    • GDB调试coredump文件

关注公众号【程序员DeRozan】,回复【1207】,免费获取计算机经典资料及现金红包

前言

  在开发程序时,稳定性是我们首先要保证的,即便是程序的性能很强,但是时不时崩溃,这是没办法接受的。
作为开发人员的基本技能,调试程序能让我们在发现问题时,尽快的直击问题发生的根源,从而快速解决问题。而在Linux上,可以通过GDB设置断点,分析原因,如果程序崩溃并且生成了core dumped,则通过GDB也可以分析到问题产生的具体代码段,这无疑是非常又必须要掌握的技能。

本文就GDB的基础用法以及core dump的生成及调试,分享下gdb的用法

GDB基础用法

GDB中,我们经常用到的命令大概可以分为这么几类

文章目录

    • 前言
    • GDB基础用法
      • 1.启动及退出调试
      • 2.设置参数
      • 3.执行程序
      • 4.流程控制
      • 5.设置断点
      • 6.输出信息
      • 7.查看栈帧
      • 8.info命令
      • 9.显示源码
    • GDB调试coredump文件

1.启动及退出调试

为了保证gdb可以调试你的程序,在编译你的程序时需要加上-g 参数

gdb <program>  进入二进制文件的调试
gdb <program> <PID> 调试program的某一个进程
gdb --args <program> <args>  带运行参数启动调试
quit/q 退出调试

2.设置参数

set args [arguments] 设置运行参数
show args  显示运行参数
set args 清空参数

3.执行程序

  1. 启动程序,即将程序跑起来
(gdb) run 
(gdb) r 
  1. 继续运行至下一个断点
如果没有断点,程序将运行至结束
(gdb) continue
(gdb) c
  1. 单步调试
(gdb) next
(gdb) n 
  1. 跳入函数体并停在第一行
(gdb) step 
(gdb) s 

4.流程控制

  1. 执行到当前函数结束返回
(gdb) finish
  1. 立即返回
(gdb) return 
(gdb) return expression  指定返回值
  1. 执行程序直至退出当前循环体
(gdb) until
(gdb) u
  1. 执行到某一行停止
(gdb) until 42
(gdb) u 42

    5.跳转至行

(gdb) jump 42

5.设置断点

  1. 在具体文件的某行设置断点
(gdb) break main.cpp:42 
  1. 在当前文件设置断点
(gdb) break 42
  1. 在函数入口处设置断点
(gdb) break 函数名 
  1. 条件断点
(gdb) b main.cpp:47 if a == 1
  1. 一次性断点
(gdb) tbreak 42 

6.删除断点

# 删除所有断点
(gdb) clear 
# 删除42行的断点
(gdb) clear 42
# 删除函数func内所有断点
(gdb) clear <func>
# 删除编号为Num的断点
(gdb) delete <Num>
# 删除所有断点
(gdb) delete breakpoints

6.输出信息

(gdb) print val
(gdb) p val

7.查看栈帧

  1. backtrace命令
    backtrace简写成bt,显示当前程序应景调用的所有函数的函数调用栈信息,每个栈有一个编号,当前调用的函数帧编号为0(栈顶)。
bt  显示所有栈bt n 显示n号栈,从栈顶算起bt -n 显示倒数n号栈 从栈底算起bt full显示栈中所有信息bt full n 显示n号栈的所有信息bt full -n 显示倒数n号栈的所有信息
  1. frame命令

    frame主要用于切换栈帧

(gdb) frame <栈帧编号>
# 查看指定栈帧详细信息
(gdb) info frame <栈帧编号>
# 进入上层栈帧
(gdb) up
# 进入下层栈帧
(gdb) down

8.info命令

info可以查看各种变量的值,如果我们希望看到详细的函数调用信息帧的信息,如:函数地址、调用函数的地址、被调用函数的地址、当前函数由哪种编程语言编写、函数参数地址形参值局部变量的地址、当前桢中存储的寄存器等.

# 缩写为 i f ,查看函数调用帧所有信息
(gdb) info frame
# 查看函数变量的值
(gdb) info args 
# 查看本地变量的信息
(gdb) info locals 
# 查看寄存器的情况(除了浮点寄存器)
(gdb) info registers
# 查看所有寄存器的情况(包括浮点寄存器)
(gdb) info all-registers

9.显示源码

  使用list来查看当前代码段的源码

# 显示当前断点处代码,默认 10 行
(gdb) list
(gdb) l# 显示区间内源码
(gdb) list <begin>,<end># 向前显示源码
(gdb) list +# 向后显示源码
(gdb) list -# 显示函数源码
(gdb) list <func># 显示指定位置源码
(gdb) list <location>

GDB调试coredump文件

 在程序发生Segmentation fault时,可以通过找到`core..,使用gdb来分析原因

  1. 什么是core文件

  core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,用于对程序进行调试。当程序崩溃时便会产生core文件,其实准确的应该说是core dump文件,默认生成位置与可执行程序位于同一目录下,文件名为core。

  1. 设置生成coredump的大小及位置

  如果程序Segmentation fault时,没有出现core文件,则可以通过如下命令查看有关core dump的设置

ulimit -a:  查看系统参数,若后面的数字为0,则代表不生成core文件
ulimit -c unlimited:    将core文件大小设置为无限制,即生成core文件# 临时设置 core 文件的生成路径为当前路径
$ sudo bash -c 'echo core.%e.%p > /proc/sys/kernel/core_pattern'# 永久设置core文件位置,在/etc/sysctl.conf文件中加入如下配置
kernel.core_pattern = core.%e.%p    #配置为程序当前路径
kernel.core_uses_pid = 0
# kernel.core_pattern = /var/core/core.%e.%p  #配置core文件生成到指定路径或者
mkdir -p /www/coredump/
chmod 777 /www/coredump//etc/profile
ulimit -c unlimited/etc/security/limits.conf
*          soft     core   unlimitedecho "/www/coredump/core-%e-%p-%h-%t" > /proc/sys/kernel/core_pattern

 生成core文件的命名,core.后面可以跟如下参数来决定生成的core文件的名字

%e:发生Segmentation fault的程序名
%p:所dump的进程PID
%c:转储文件的大小上限
%g:所dump的进程的实际组ID
%h:主机名
%s:导致本次coredump的信号
%t:转储时刻(由1970年1月1日起计的秒数)
%u:所dump进程的实际用户ID
  1. 使用gdb调试core文件

   成功生成 core 文件之后,可以通过以下命令来使用GDB调试core文件。

$ gdb <program> <core>

 例如

$ gdb Client core.Client.26823
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from Client...done.
[New LWP 26823]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./Client'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  __GI___libc_free (mem=0xcdfe302f93dfa028) at malloc.c:3113
3113    malloc.c: No such file or directory.

 程序在malloc.c:3113 出现了问题,使用where命令查看程序内函数的调用过程, 可以看到具体在哪个文件的哪一行出现了问题

在gdb中输入where命令,可以获取堆栈调用信息。当进行coredump调试时候,这个是最基本且最有用处的命令。where命令输出的结果包含程序中 的函数名称和相关参数值。

(gdb) where
#0  __GI___libc_free (mem=0xcdfe302f93dfa028) at malloc.c:3113
#1  0x00007f72e61c3f67 in SendCommandClass<tutorial::Agent_Cpu, tutorial::Agent_Cpu>::sendCommandToAddr (this=0x563bab7c04f0, cmd=301, port=5050, in=..., out=...) at src/Convert.h:146
#2  0x00007f72e61c2083 in SpcSendAndRecvProtobufToAddrFunc (cmd=301, port=5050, in=..., out=...)at src/Convert.cpp:138
#3  0x00007f72e61c41c2 in SendMsgToAddr (cmd=301, port=5050, in=..., out=...)at src/Client.cpp:34
#4  0x00007f72e61c424a in SpcSendAndRecvProtobufToAddr (in=..., out=..., port=5050, cmd=301)at src/Client.cpp:47
#5  0x0000563bab32541a in main (argc=1, argv=0x7ffcf014fe28) at src/Client.cpp:195

在多线程运行的时候,core不一定在当前线程,这就需要我们对代码有一定的了解,能够保证哪块代码是安全的,然后通过thread num切换线程,然后再通过bt或者where命令查看堆栈信息,进而定位coredump原因。

  以上仅仅是对单线程的调试基本用法,对于多线程,则需要其他的相关命令来进行调试。

相关文章:

使用gdb来debug程序并查找Segmentation fault原因

GDB 调试前言GDB基础用法1.启动及退出调试2.设置参数3.执行程序4.流程控制5.设置断点6.输出信息7.查看栈帧8.info命令9.显示源码GDB调试coredump文件关注公众号【程序员DeRozan】&#xff0c;回复【1207】&#xff0c;免费获取计算机经典资料及现金红包 前言 在开发程序时&…...

vbs简单语法及简单案例

文章目录一、简单语法1、变量2、输入3、输出4、选择语句5、循环二、用记事本编译中文乱码问题三、制作一个简单vbs脚本表白一、简单语法 1、变量 语法&#xff1a; dim 变量名例&#xff1a; dim a,b a1 b2 msgbox ab运行&#xff1a; 2、输入 语法&#xff1a;InputBox(…...

学板绘课程学费一般多少钱

学板绘课程学费一般多少钱&#xff1f;培训机构的费用和师资、模式有关&#xff0c;价格贵不贵要结合相同类型的机构多多对比。因为好些平台做了很多的宣传广告&#xff0c;运营成本很高&#xff0c; 终羊毛出在羊身上&#xff0c;这样的机构知名度很高&#xff0c;但是性价比不…...

48.在ROS中实现local planner(1)- 实现一个可以用的模板

有了之前45.在ROS中实现global planner&#xff08;1&#xff09;- 实现一个可以用模板的global planner的经验, 现在再去创建一个local planner的包就容易多了 1. 创建包 创建 cd ~/pibot_ros/ros_ws/src # 这里可以使用自己的ros workspace catkin_create_pkg sample_loc…...

jenkins基础部署

一、jenkins是什么1.Jenkins的前身是Hudson&#xff0c;采用JAVA编写的持续集成开源工具。Hudson由Sun公司在2004年启动&#xff0c;第一个版本于2005年在java.net发布。2007年开始Hudson逐渐取代CruiseControl和其他的开源构建工具的江湖地位。在2008年的JavaOne大会上在开发者…...

Unity3D -知识点(1)

1.场景视图鼠标滚轮&#xff1a;场景放大缩小鼠标右键&#xff1a;场景左右平移场景编辑器中&#xff0c;能看到什么&#xff1f;网格&#xff0c;每一格大小为1unit&#xff0c;建模不同&#xff0c;规定不同&#xff0c;(对应屏幕上100个像素)世界坐标系y轴向上为正x轴向右为…...

【学习笔记】NOIP暴零赛3

博弈(game) 观察到博弈过程中胜负态不会发生改变&#xff0c;那么求出从每个棋子出发能走的最长链&#xff0c;然后背包即可。 复杂度O(nm)O(nm)O(nm)。 #include<bits/stdc.h> #define ll long long #define pb push_back using namespace std; const int mod9982443…...

Java JSR规范列表

Java JSR规范列表目录概述需求&#xff1a;设计思路实现思路分析1.JSR2.JSR方法3.web service4.Webservice:5.数据处理器拓展实现参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,m…...

Java必备小知识点1

Java程序类型: Applications和AppletApplications:是指在计算机操作系统中运行的程序。是完整的程序&#xff0c;能独立运行。被编译后&#xff0c;用普通的Java解释器就可以使其边解释边执行。必定含有一个main方法&#xff0c;程序执行时&#xff0c;首先寻找main方法&#x…...

JavaScript作用域、闭包

文章目录作用域、作用域链作用域作用域链循环中的作用域自由变量、闭包自由变量闭包的定义、表现、应用如何确定在闭包中获取正确的变量总结作用域、作用域链 作用域 编程语言中存储、访问、修改变量当中的值是一项基本能力、存储变量、访问变量必须按照一定的规则&#xff0…...

JavaScript Date(日期) 对象

JavaScript Date 对象是 JavaScript 中用于处理日期和时间的内置对象。它可以用于获取当前时间、设置日期和时间、计算日期和时间之间的差异、以及将日期和时间格式化为各种字符串格式。在本文中&#xff0c;我们将详细介绍 JavaScript Date 对象的作用和在实际工作中的用途。 …...

rust过程宏 proc-macro-workshop解题-4-sorted

名字版本号rust1.69.0OSubuntu 22.04这一大关卡介绍的是属性式过程宏。 第一关:01-parse-enum 还是简单的看我们是否已经实现了一个属性式过程宏的空架子,如果有这个空架子,就直接通过了。 use proc_macro::TokenStream; use proc_macro2; use syn;#[proc_macro_attribut…...

数据结构与算法—队列

队列 队列介绍 有序列表&#xff0c;可以用数组或者链表实现。遵循先进先出原则。 数组实现队列 public class ArrayQueue {public static void main(String[] args) {ArrayQueue queue new ArrayQueue(3);// 接收用户输入char key ;Scanner sc new Scanner(System.in);…...

AcWing3416.时间显示——学习笔记

目录 题目 代码 AC结果 思路 关键步骤 题目 3416. 时间显示 - AcWing题库https://www.acwing.com/problem/content/description/3419/ 代码 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner input new Scanner(System.in…...

贴吧手机端防删图GIF动态图制作解析

贴吧存活 思路技术运气 1&#xff1a;防删图不是存活的绝对因素&#xff0c;除了防删图&#xff0c;还有账号&#xff0c;ip&#xff0c;内容&#xff0c;吧的问题 2&#xff1a;一个图不是每个吧都可以发 3&#xff1a;一个贴不被删不仅仅看图片 4&#xff1a;有时候运气也很…...

iOS接入Google登录

1.在Google Cloud后台配置客户端ID 首先要在 Google Cloud 中创建一个项目。新创建的Project需要先配置同意屏幕。一共有4步骤需要配置。 1.OAuth 同意屏幕 User Type选择"外部"进行创建。填写必必要的信息&#xff0c;应用名称、用户支持电子邮件地址、开发者电子邮…...

【C语言】大小端字节序问题

一、大小端字节序问题 大小端是由CPU决定的&#xff0c;大小端可以理解为字节顺序&#xff0c;所以大小端全称叫大端字节序、小端字节序。其实大端、小端这两个词是从《格列佛游记》里出来的。《格列佛游记》有一段讲的是吃鸡蛋是从大的那头敲开还是小的那头敲开的问题&#xf…...

Linux | 网络通信 | 序列化和反序列化的讲解与实现

文章目录为什么要序列化&#xff1f;协议的实现服务端与客户端代码实现为什么要序列化&#xff1f; 由于默认对齐数的不同&#xff0c;不同的平台对相同数据进行内存对齐后&#xff0c;可能得到不同的数据。如果直接将这些数据进行网络传输&#xff0c;对方很可能无法正确的获…...

C#的委托原理刨析and事件原理刨析和两者的比较

什么是委托委托是一种引用类型&#xff0c;表示对具有特定参数列表和返回类型的方法的引用。 在实例化委托时&#xff0c;你可以将其实例与任何具有兼容参数和返回类型的方法进行绑定。 你可以通过委托实例调用方法。简单的理解&#xff0c;委托是方法的抽象类&#xff0c;它定…...

Redis学习【8】之Redis RDB持久化

文章目录Redis 持久化1 持久化基本原理2 RDB(Redis DataBase) 持久化2.1 持久化的执行2.2 手动 save 命令2.3 手动 bgsave 命令2.4 自动条件触发2.5 查看持久化时间3 RDB 优化配置3.1 save3.2 stop-write-on-bgsave-error3.3 rdbcompression3.4 rdbchecksum3.5 sanitize-dump-p…...

SpringSecurity认证

文章目录登陆校验流程依赖yaml实现建表、工具类、实体类加密器、AuthenticationManager登录逻辑登录过滤器、配置过滤器登出登陆校验流程 认证 登录&#xff1a; ​ ①自定义登录接口 ​ 调用ProviderManager的方法进行认证 如果认证通过生成token&#xff0c;根据userId把用…...

Socket套接字

概念 Socket套接字&#xff0c;是由系统提供用于网络通信的技术&#xff0c;是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 分类 Socket套接字主要针对传输层协议划分为如下三类&#xff1a; 流套接字&#xff1a;使用传输层TCP…...

mysql详解之innoDB

索引 Mysql由索引组织&#xff0c;所以索引是mysql多重要概念之一。 聚簇索引 InnoDB和MyISAm一样都是采用B树结构&#xff0c;但不同点在于InnoDB是聚簇索引&#xff08;或聚集索引&#xff09;&#xff0c;将数据行直接放在叶子节点后面。 这里可能存在一个误区&#xff1…...

电信运营商的新尝试:探索非通信领域的发展

近年来&#xff0c;随着电信运营商竞争的日趋激烈和网络建设的成本不断攀升&#xff0c;许多电信运营商已经开始缩减IT投资。然而&#xff0c;在如此情况下&#xff0c;电信运营商仍然需要寻找新的增长机会。那么&#xff0c;在持续缩减IT投资的情况下&#xff0c;电信运营商可…...

第07章_单行函数

第07章_单行函数 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. 函数的理解 1.1 什么是函数 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经…...

Echarts实现多柱状图重叠重叠效果

有两种重叠效果: 1. 多个柱子重叠为一个 2. 多个柱子重叠为两组 第一种,图例: 这个灰色不是阴影哦, 是柱子. 1. 使用详解 (1) series.Z 折线图组件的所有图形的 z 值。控制图形的前后顺序。 z 值小的图形会被 z 值大的图形覆盖。z 相比 zlevel 优先级更低&#xff0c;而且不会…...

PHP学习笔记(一谦四益)

前言 上一篇文章 PHP学习笔记&#xff08;观隅反三&#xff09;分享了数组的知识&#xff0c;这篇文章接着分享和数组相关的算法。 算法效率 算法效率分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。时间效率被称为时间复杂度&#xff0c;而空间效率被称…...

Jvm -堆对象的划分

堆对于一个jvm进程来说是唯一的&#xff0c;一个进程只有一个jvm&#xff0c;但是进程半酣多个线程&#xff0c;多个线程共享一个堆。 也就是说&#xff0c;一个jvm实例只存在一个堆&#xff0c;同时对也是Java内存管理的核心区域。 Java堆区域的大小在jvm启动时就已经被确定…...

2023美赛F题讲解+数据领取

我们给大家准备了F题的数据&#xff0c;免费领取&#xff01;在文末 国内生产总值(GDP)可以说是一个国家经济健康状况最著名和最常用的指标之--。它通常用于确定一个国家的购买力和获得贷款的机会,为各国提出提高GDP的政策和项目提供动力。GDP“衡量一个国家在给定时间段内生产…...

【博客625】keepalived开启garp refresh的重要性

keepalived开启garp refresh的重要性 1、场景 1-1、对keepavlied master机器热迁移后出现vip不通&#xff0c;过后恢复 原因&#xff1a;机器迁移后网关那边的arp表没有刷新&#xff0c;流量还是转发到老的端口&#xff0c;但是机器已经迁移到别的端口了&#xff0c;于是网络…...

微信公众号小说代理和网站结合怎么做/推广app赚佣金平台

一、选择题1. 正确的C语言标识符是_____。A&#xff0e;_buy_2 B&#xff0e;2_buy C&#xff0e;?_buy D&#xff0e;buy?2. 以下是C语言提供的合法关键字的是_____。A&#xff0e;Float B&#xff0e;signed C&#xff0e;integer D&#xff0e;Char3. 以下不能定义为用户标…...

wordpress 能用的水印/网络推广好做吗?

导读 11月7日&#xff0c;以微信支付为核心微信智慧医疗服务再次创新&#xff0c;由微信支付与互联网团队联手推出医疗保险无纸化手机端快捷理赔&#xff0c;患者无需提供纸质材料&#xff0c;只需通过微信即可在线上快速完成医疗保险理赔。这也是微信首次打通商业保险&#x…...

网站开发报价模板/微信营销推广软件

1 " 使用格式转换软件可以将某种格式的视频文件转换为其它格式的视频文件。 T()正确()错误2 " 在 Excel 中,活动单元格地址显示在名称框内。 T()正确()错误3 " 在 Excel 中.工作表的数量是固定的 ,不能再次添加。 F()正确()错误4 " 在一个 Exce|单元格中输…...

广州建设局网站首页/360站长平台链接提交

python3 操作excel 更多干货 分布式实战&#xff08;干货&#xff09;spring cloud 实战&#xff08;干货&#xff09;mybatis 实战&#xff08;干货&#xff09;spring boot 实战&#xff08;干货&#xff09;React 入门实战&#xff08;干货&#xff09;构建中小型互联网企业…...

厦门高端模板建站/东莞整站优化排名

通过分析reduceByKey和groupByKey的源码&#xff0c;发现两个算子都使用了combineByKey这个算子&#xff0c;那么现在来分析一下combineByKey算子。 /*** Simplified version of combineByKey that hash-partitions the output RDD.*/def combineByKey[C](createCombiner: V &g…...

mac安装字体打开wordpress/今日热点新闻头条

yum install httpd httpd-devel yum install mod_wsgi 1、主配置文件是/etc/httpd/conf/httpd.conf 主配置文件加后加&#xff1a; LoadModule wsgi_module modules/mod_wsgi.so 2、在项目目录下新建wsgi&#xff0c;里面新建django.wsgi&#xff0c;内容如下import os import…...