GDB Debugging Notes

Debugging programs using gdb

1.1 gdb简介

        gdb是一个功能强大的调试工具,可以用来调试C程序或C++程序。在使用这个工具进行程序调试时,主要涉及下面几个方面的操作:

  • 启动程序:在启动程序时,可以设置程序运行环境。
  • 设置断点:程序会在断点处停止,以便于用户 查看程序的运行情况。
  • 查看信息:在断点停止后,可以查看程序的运行信息和显示程序变量的值。
  • 分步运行:可以让程序一个语句一个语句地执行,这时可以及时查看程序的信息。
  • 改变环境:可以在程序运行时改变程序的运行环境和程序变量。

1.2 gdb常用指令

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • p 变量:打印变量值。
  • set var:修改变量的值
  • continue(或c):从当前位置开始连续而非单步执行程序
  • run(或r):从开始连续而非单步执行程序
  • delete breakpoints:删除所有断点
  • delete breakpoints n:删除序号为n的断点
  • disable breakpoints:禁用断点
  • enable breakpoints:启用断点
  • info(或i) breakpoints:参看当前设置了哪些断点
  • display 变量名:跟踪查看一个变量,每次停下来都显示它的值
  • undisplay:取消对先前设置的那些变量的跟踪
  • until X行号:跳至X行
  • breaktrace(或bt):查看各级函数调用及参数
  • info(i) locals:查看当前栈帧局部变量的值
  • quit:退出gdb

1.3 示例:

(1)示例程序源码

编译源码时加上调试选项:

(2)运行gdb

(3)在gdb中查看代码

(4)在程序中加入断点,查看断点信息

(5)运行程序,输出断点处的堆栈信息

(6)单步运行,输出变量值

2 Analyzing coredump file by gdb

2.1 coredump文件简介

在Linux中,当进程崩溃或异常终止时,系统会将进程的内存状态写入一个coredump文件中,这个文件包含了进程崩溃时的内存映像,可以用于分析进程崩溃的原因。

2.2 coredump文件的存储路径

执行如下指令查询coredump文件的存储路径:

cat /proc/sys/kernel/core_pattern

注意:默认值是core,表示当前目录,否则就是在指定目录下。

2.3 coredump产生的原因

造成程序coredump的原因有很多,这里总结一些常见情况:

(1) 内存访问越界

这种错误最常遇见,例如向strcmp函数中传入空指针导致的coredump

(2) 多线程程序使用了线程不安全的函数

多线程程序应该使用可重入的函数(带有"_r"后缀的函数)

(3) 多线程读写的数据未加锁保护

对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump

(4) 非法指针

随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。

(5) 堆栈溢出

不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

2.4 使用gdb分析coredump文件

gdb是Linux中一个强大的调试工具,也可以用于分析coredump文件。使用gdb命令打开coredump文件,然后运行backtrace(bt)命令可以查看崩溃时的函数调用堆栈信息。

gdb -c [core_file] [exec_file]    # -c 指定转储的 core 文件
(gdb) bt                          # 查看当前堆栈(断点所在的调用栈)

注意:需要在Makefile中添加调试选项

2.5 实例Mint mesh组网期间of_controller进程异常终止

2.5.1 在Makefile中添加调试选项,如下图所示共修改了三处:

(1)添加”-g3”编译选项

① “-g1”, 不包含局部变量和与行号有关的调试信息,只能够用于回溯跟踪和堆栈转储之用。

② “-g2”, 此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。

③ “-g3”, 包含g2中的所有调试信息,以及源代码中定义的宏。

(2)将”-O1”选项修改为”-O0”

使用”-O”选项时编译器会尝试减小代码尺寸,并去除相关的调试信息,因此这里修改为”-O0”,即不进行优化。

(3)屏蔽strip语句

strip经常用来去除目标文件中的一些符号表、调试符号表信息,以减小静态库、动态库和程序的大小。这里屏蔽strip语句,即不对生成的bin文件执行strip操作。

2.5.2 使用gdb分析生成的coredump文件

(1)查看coredump文件的存储路径

(2)将coredump文件拿到编译环境的server上,放在of_controller生成的目录下

(3)进入docker(toolchain安装在docker中),然后执行:

gdb -c [core_file] [exec_file]

(4)在gdb中执行bt 指令,输出断点处的栈帧信息(进程崩溃时的栈帧信息)

结论:通过进程崩溃时的栈帧信息可知,进程在of_ctrl_user_dm_update_iad2.c文件第881行的of_ctrl_user_dm_ap_update()函数中发生异常。(最上面的栈帧表示最后调用的函数)

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

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

相关文章

Double 4 VR智能互动系统在轨道交通实训教学中的应用

Double 4 VR智能互动系统是一种集成了虚拟现实技术、人工智能和物联网技术的教学系统。计算机通过模拟真实的轨道交通环境,为学生提供了一个高度仿真的学习环境,帮助他们更好地理解和掌握轨道交通的相关知识和技能。 首先,Double 4 VR智能互动…

composer切换全局镜像源的方法

composer 默认配置中的镜像地址为国外的,在下载一些依赖包的时候会感觉很慢。当然国内也有很多composer镜像地址的,比如阿里云,腾讯云等。下面的博文73so博客就和大家说说,如何将composer的默认镜像改为国内镜像源的方法。 compo…

Redis跳跃表

前言 跳跃表(skiplist)是一种有序数据结构,它通过在每一个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。 跳跃表支持平均O(logN),最坏O(N),复杂度的节点查找,还可以通过顺序性来批量处理节点…

【数组】-数组里的所有数字都在 0 到 n-1范围内,判断该数组中是否有重复的数

写在前面 最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内,判…

2021秋招-算法-递归

算法-递归 教程: ⭐告别递归,谈谈我的一些经验 LeetCode刷题总结-递归篇 基础框架 leetcode刷题 1.leetcode-101. 对称二叉树-简单 101. 对称二叉树 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。…

子虔与罗克韦尔自动化合作 进博会签约自动化净零智造联创中心

11月6日进博会现场,漕河泾罗克韦尔自动化净零智造联创中心合作协议签约暨合作伙伴(第一批)授牌仪式举办,子虔科技作为联创中心合作伙伴签约,携手共建智能制造,引领行业可持续发展。 图示:子虔科…

C 标准库 - <time.h>和<float.h>详解

目录 简介 库变量 库宏 库函数 简介 库变量 库宏 库函数 <time.h> 简介 C 标准库中的 <time.h> 头文件提供了处理时间和日期的函数和类型定义。它包含了一些结构体和函数&#xff0c;可以用于获取系统当前的日期、时间&#xff0c;以及进行日期和时间的计算…

【电路笔记】-电源电压

电源电压 文章目录 电源电压1、概述1.1 交流发电机1.2 电池1.3 理想电压源1.4 实际电压源1.5 连接规则 2、相关源2.1 压控电压源 (VCVS)2.2 电流控制电压源 (CCVS) 3、总结 在本文中&#xff0c;我们详细介绍了称为电源电压的重要电子元件的架构、功能和使用。 我们首先提出理想…

MySQL复杂查询与优化:窗口函数、分页查询与查询计划优化

在MySQL数据库中&#xff0c;进行复杂查询并优化查询计划是提高数据库性能的关键。本文将深入探讨窗口函数、分页查询以及查询计划优化的方法。 1. 窗口函数&#xff08;Window Functions&#xff09; 1.1 什么是窗口函数&#xff1f; 窗口函数是一种在查询结果集内执行聚合…

【开题报告】基于SpringBoot的网上摄影工作室的设计与实现

1.选题背景与意义 随着社交媒体的普及和人们对个人形象的重视&#xff0c;摄影行业发展迅速。传统的摄影工作室在数字化时代也需要向线上转型&#xff0c;以满足用户更便捷、快速的需求。因此&#xff0c;基于SpringBoot的网上摄影工作室的设计与实现具有以下背景和意义&#…

前端面试题【72道】

文章目录 1. 说说你对盒子模型的理解2. css选择器有哪些&#xff1f;优先级&#xff1f;哪些属性可以继承&#xff1f;3. 元素水平垂直居中的方法有哪些&#xff1f;如果元素不定宽高呢&#xff1f;4. 怎么理解回流跟重绘&#xff1f;什么场景下会触发&#xff1f;5. 什么是响应…

从零开始学习typescript——数据类型

数据类型 以前我们用js编写代码的时候&#xff0c;都是直接使用let、var、const 来定义数据类型&#xff1b;js会在运行时来确定数据类型&#xff0c;但是在ts中&#xff0c;可以在声明时就可以指定数据类型。如果你学过其他编程语言&#xff0c;比如c、java就能更好的理解了。…

Android 12.0 mt6771新增分区功能实现三

1.前言 在12.0的系统开发中,在对某些特殊模块中关于数据的存储方面等需要新增分区来保存, 所以就需要在系统分区新增分区,接下来就来实现这个功能,看第三部分关于的实现新增分区的过程 2.mt6771新增分区功能实现三的核心类 build/make/tools/releasetools/common.pydevic…

什么是神经网络(Neural Network,NN)

1 定义 神经网络是一种模拟人类大脑工作方式的计算模型&#xff0c;它是深度学习和机器学习领域的基础。神经网络由大量的节点&#xff08;或称为“神经元”&#xff09;组成&#xff0c;这些节点在网络中相互连接&#xff0c;可以处理复杂的数据输入&#xff0c;执行各种任务…

Docker安装Zookeeper

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【数据结构】栈和队列的模拟实现

前言&#xff1a;前面我们学习了单链表并且模拟了它的实现&#xff0c;今天我们来进一步学习&#xff0c;来学习栈和队列吧&#xff01;一起加油各位&#xff0c;后面的路只会越来越难走需要我们一步一个脚印&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x…

【ArcGIS Pro微课1000例】0034:矢量数据几何校正案例(Spatial Adjustment)

本案例讲解矢量数据几何校正&#xff0c;根据一个矢量数据去校正另外一个矢量数据。 文章目录 一、加载实验数据二、空间校正三、注意事项 一、加载实验数据 在ArcGIS Pro中加载数据效果如下&#xff1a; design&#xff1a;需要校正的数据图层planroadcenter&#xff1a;目标…

ubuntu22.04安装网易云音乐

附件&#xff1a; https://download.csdn.net/download/weixin_44503976/88557248 wget https://d1.music.126.net/dmusic/netease-cloud-music_1.2.1_amd64_ubuntu_20190428.deb wget -O patch.c https://aur.archlinux.org/cgit/aur.git/plain/patch.c?hnetease-cloud-m…

【Docker】从零开始:5.Docker安装与卸载

【Docker】从零开始&#xff1a;4.Docker安装 安装步骤1.确定你是CentOS7及以上版本2.卸载旧版本a.查看是否已安装dockerb.如何安装了卸载docker 3.通过yum安装gcc相关依赖包4.安装需要的软件包5.设置yum stable镜像仓库 &#xff08;源&#xff09;1.备份源2.配置源阿里云仓库…

数据库的基本概念以及MySQL基本操作

一、数据库的基本概念 1、数据库的组成 数据&#xff1a;描述事物的符号记录 包括数字&#xff0c;文字、图形、图像、声音、档案记录等 以“记录”形式按统一格式进行存储 表&#xff1a;将不同的记录组织在一起&#xff0c;用来存储具体数据 数据库&#xff1a; 表的集合…