GDB Debugging Notes
1 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()函数中发生异常。(最上面的栈帧表示最后调用的函数)
相关文章:

GDB Debugging Notes
1 Debugging programs using gdb 1.1 gdb简介 gdb是一个功能强大的调试工具,可以用来调试C程序或C程序。在使用这个工具进行程序调试时,主要涉及下面几个方面的操作: 启动程序:在启动程序时,可以设置程序运行环境。设置断点:程序…...

Azure Machine Learning - 创建Azure AI搜索服务
目录 准备工作查找 Azure AI 搜索产品/服务选择订阅设置资源组为服务命名选择区域选择层创建服务配置身份验证扩展服务何时添加第二个服务将多个服务添加到订阅 Azure AI 搜索是用于将全文搜索体验添加到自定义应用的 Azure 资源,本文介绍如何创建Azure AI搜索服务 …...

鸿蒙(HarmonyOS)应用开发——安装DevEco Studio安装
前言 HarmonyOS华为开发的操作系统,旨在为多种设备提供统一的体验。它采用了分布式架构,可以在多个设备上同时运行,提供更加流畅的连接和互动。HarmonyOS的目标是提供更高的安全性、更高效、响应更快的用户体验,并通过跨设备功能…...

成都数字孪生技术推进制造业升级,工业物联网可视化应用加速
成都数字孪生技术推进制造业升级,工业物联网可视化应用加速。灯塔工厂转型的关键在于第四次工业革命新技术的应用。数字孪生灯塔工厂是工业4.0技术的应用典范,工业4.0的核心技术包括:数字孪生、大数据分析,工业物联网,…...

管理类联考——数学——汇总篇——知识点突破——代数——函数——记忆
文章目录 整体文字提炼图像绘画 考点记忆/考点汇总——按大纲 本篇思路:根据各方的资料,比如名师的资料,按大纲或者其他方式,收集/汇总考点,即需记忆点,在通过整体的记忆法,比如整体信息很多&am…...

Flash Attention:高效注意力机制的突破与应用
注意力机制彻底改变了自然语言处理和深度学习领域。它们允许模型在执行机器翻译、语言生成等任务时专注于输入数据的相关部分。 在这篇博客[1]中,我们将深入研究被称为“Flash Attention”的注意力机制的突破性进展。我们将探讨它是什么、它是如何工作的,…...

Flutter开发警告Constructors in ‘@immutable‘ classes should be declared as ‘const‘
文章目录 警告信息报错代码警告原因修改后的代码 警告信息 Flutter开发遇到如下警告 Constructors in ‘immutable’ classes should be declared as ‘const’. 报错代码 class TaskWidget extends StatefulWidget {final String title;final bool isChecked;final int ord…...

想当老师应该去学什么专业
专业选择是决定未来职业发展的重要步骤,如果你也想成为一名老师,那么这五个专业可能会适合你! 教育学专业 教育学专业是培养教育理论和方法的学科,这些理论知识将帮助你理解教学过程、学生发展、课程设计和评估。该专业将让你全面…...

【LM、LLM】浅尝二叉树在前馈神经网络上的应用
前言 随着大模型的发展,模型参数量暴涨,以Transformer的为组成成分的隐藏神经元数量增长的越来越多。因此,降低前馈层的推理成本逐渐进入视野。前段时间看到本文介绍的相关工作还是MNIST数据集上的实验,现在这个工作推进到BERT上…...

鸿蒙4.0开发笔记之ArkTs语言基础与基本组件结构(四)
文章声明:本文关于HarmonyOS系统的部分内容和描述借鉴于华为官网的“HarmonyOS开发者学堂”,有需要的也可以进入官网查看。<HarmonyOS第一课>ArkTS开发语言介绍 一、ArkTs语言介绍 ArkTS是鸿蒙系统(HarmonyOS)优选的主力应…...

Another app is currently holding the yum lock; waiting for it to exit...
今天使用yum进行下载的时候报错 解决办法: 执行 rm -f /var/run/yum.pid 然后重新运行yum指令即可,发现已经可以正常下载啦!...
size和shape的区别与联系
对于Numpy数据类型 shape和size都是属于Numpy的属性 arr.shape 将返回一个包含两个元素的元组,例如 (m, n),其中 m 表示数组的行数,n 表示数组的列数。arr.size 将返回数组中元素的总数。 举例: 输入: import numpy as np# 创…...

浅谈STL中的分配器
分配器是STL中的六大部件之一,是各大容器能正常运作的关键,但是对于用户而言确是透明的,它似乎更像是一个幕后英雄,永远也不会走到舞台上来,观众几乎看不到它的身影,但是它又如此的重要。作为用户ÿ…...

禁止指定电脑程序运行的2种方法
你可能要问了,为什么要禁止电脑程序运行呢,因为有的公司要净化公司的工作环境,防止某些刺头员工在公司电脑上瞎搞。也有部分家长,是为了防止自己家的孩子利用电脑乱下载东西。 今天就分享2种禁止指定电脑程序运行的方法࿱…...

【Redis】前言--redis产生的背景以及过程
一.介绍 为什么会出现Redis这个中间件,从原始的磁盘存储到Redis中间又发生了哪些事,下面进入正题 二.发展史 2.1 磁盘存储 最早的时候都是以磁盘进行数据存储,每个磁盘都有一个磁道。每个磁道有很多扇区,一个扇区接近512Byte。…...

Java面试-微服务篇-SpringCloud
Java面试-微服务篇-SpringCloud SpringCloud 常见组件注册中心Eureka, Nacos负载均衡Ribbon服务雪崩, 熔断降级微服务的监控来源 SpringCloud 常见组件 通常情况下 Eureka: 注册中心Ribbon: 负载均衡Feign: 远程调用Hystrix: 服务熔断Zuul/Gateway: 网关 SpringCloudAlibaba…...

Git使用详解
文章目录 ⭐️写在前面的话⭐️📌What is it?Git的诞生 🌈Why learn it?集中式vs分布式 🧲Who does it?🎈When to use it? And Where to use it?💊How to use it?(重点)1、安装Git在Linux…...

智慧楼宇可视化视频综合管理系统,助力楼宇高效安全运行
随着互联网技术的进步和发展,智能化的楼宇建设也逐步成为人们选择办公场所是否方便的一个重要衡量因素。在智能化楼宇中,安全管理也是重要的一个模块。得益于互联网新兴技术的进步,安防视频监控技术也得到了快速发展并应用在楼宇的安全管理中…...

【opencv】计算机视觉:实时目标追踪
目录 前言 解析 深入探究 前言 目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉,还可以应用到交通上,比如实时监测车辆是否超速等!对于国家的军事也具有一定的意义&a…...

生态对对碰|华为OceanStor闪存存储与OceanBase完成兼容性互认证!
近日,北京奥星贝斯科技有限公司 OceanBase 数据库与华为技术有限公司 OceanStor Dorado 全闪存存储系统、OceanStor 混合闪存存储系统完成兼容性互认证。 OceanBase 数据库挂载 OceanStor 闪存存储做为数据盘和日志盘,在 OceanStor 闪存存储系统卓越性能…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...