自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 嵌入式系统中 `std::vector` 动态扩容与 “invalid chunk size” 错误那些事儿

摘要: 在嵌入式系统中,std::vector的push_back()操作可能因动态扩容引发内存分配失败,表现为"invalid chunk size"错误。其机制是当容量不足时,vector会按约2倍扩容,但频繁扩容会导致内存碎片,最终因无法分配连续大内存而失败。标准情况下会抛出std::bad_alloc异常,若未处理则可能破坏内存管理结构,触发未定义行为。解决方案包括:1) 预分配内存(reserve());2) 捕获bad_alloc异常实现降级处理;3) 监控并整理内存碎片。这

2025-07-11 10:36:24 283

原创 嵌入式系统中“invalid chunk size”内存问题深度剖析与解决

嵌入式系统“invalid chunk size”内存问题分析与解决 在激光雷达数据处理嵌入式系统中,我们遇到了因内存碎片引发的"invalid chunk size"错误。分析发现,频繁创建销毁含动态内存的对象(如LaserScan)导致内存碎片化,进而破坏内存元数据。解决方案包括:1)采用对象池技术复用对象;2)预分配足够内存空间;3)完善内存分配失败处理机制。这些措施有效减少了内存碎片,稳定了系统运行。经验表明,在资源受限环境中应避免频繁内存操作,重视内存元数据保护。

2025-07-11 10:32:25 441

原创 glibc堆管理揭秘:`malloc_consolidate`与`unlink_chunk`的崩溃迷局

掌握堆管理的底层逻辑,是解决内存崩溃的关键——毕竟,只有理解“敌人”的运作方式,才能构建更坚固的防线。才能从根本上避免堆链表校验失败,让程序在复杂内存环境中稳定运行。是 glibc 堆管理的“卫士”,但它们无法抵御。报错往往是堆内存“内伤”的直观体现。的工作机制,以及堆溢出如何突破这些防护。为解决外部碎片,glibc 提供。切入,结合真实崩溃案例,解析。在C++程序的内存崩溃问题中,),导致堆溢出风险被放大。可知,堆数据段无限制(

2025-07-05 19:57:48 563

原创 堆溢出为何会篡改指针?从内存布局到防御实践

堆溢出篡改指针是C++开发中的常见问题,当堆分配的内存块发生溢出时,越界数据会覆盖相邻内存区域,导致指针变量被非法篡改。这种现象通常发生在堆与指针变量相邻的内存布局中,溢出数据会像"洪水"一样破坏指针的正常值,形成指向非法地址的"毒指针"。常见场景包括栈上指针被堆溢出覆盖、堆数据结构指针被篡改以及容器扩容引发的溢出。防御措施包括预分配内存避免溢出、边界检查、使用安全API、内存检测工具以及智能指针管理。理解内存布局本质并建立主动防护体系,才能有效防止堆溢出导致的指针篡

2025-07-05 19:54:35 271

原创 ARM架构下C++程序堆溢出与栈堆碰撞问题深度解析

ARM架构下C++程序堆溢出问题解析与解决方案 在ARM架构嵌入式系统中,程序崩溃常表现为堆溢出导致栈内存被覆盖,典型特征是unlink_chunk错误和栈变量被篡改为堆地址(如minPts=-1320155448)。问题根源在于ARM独特的内存布局:堆向上扩展而栈向下扩展,两者相向增长可能导致碰撞。典型触发场景是未预分配的容器(如vector)频繁扩容引发堆溢出。解决方案包括:1)预分配容器内存避免动态扩容;2)设置合理的系统资源限制;3)使用AddressSanitizer等工具检测内存错误。最佳实践包

2025-07-05 19:40:08 886

原创 多线程程序中内存越界崩溃的延迟性与调试策略

多线程程序中,内存越界崩溃的延迟性和随机性,给问题排查带来了很大难度。其根源在于堆内存的共享性和线程调度、内存布局的不确定性。通过使用内存检测工具(如ASan、Valgrind)、添加防御性代码、严格遵循编码规范(边界检查、线程同步等),可以有效定位和预防此类问题。在多线程编程中,开发者应重视内存管理,提前规避风险,保障程序的稳定性和可靠性。

2025-07-01 11:43:12 646

原创 多线程编程中的三大内存竞态陷阱:从原理到实战解决方案

本文深入剖析多线程编程中三个易被忽视的安全陷阱:局部动态数组的堆竞态、emplace_back构造副作用和全局堆管理器冲突。文章揭示多线程安全不仅涉及变量作用域,更与底层资源共享和内存模型相关。通过glibc的arena机制分析、构造函数的副作用风险演示,以及现代内存管理技术对比,提出分层防护策略和优化方案。最后总结多线程内存管理的黄金法则:警惕局部变量背后的全局资源、实施分层防护、善用现代化工具(如ThreadSanitizer、mimalloc)以及根据场景选用合适的内存分配器。

2025-06-21 19:18:35 873

原创 多线程内存分配竞态:为什么独立内存块仍会崩溃?(smallbin double linked list corrupted)

多线程程序中,即使各线程操作独立的内存块,仍可能出现堆崩溃。这是由于glibc的堆管理器使用全局链表管理空闲内存块,多线程并发调用malloc/free时会竞争修改这些共享链表指针。虽然glibc通过全局锁保护堆操作,但粗粒度锁仍无法完全避免竞态。解决方案包括使用线程本地存储实现独立内存池,或采用jemalloc/tcmalloc等线程优化的分配器。关键结论是:真正的线程安全需要考虑底层数据结构的并发访问,而不仅是内存块本身的独立性。

2025-06-21 18:46:30 617

原创 深入理解glibc堆管理器:为什么双向链表在多线程下不安全?

glibc堆管理器的双向链表本身不是线程安全的,其线程安全性依赖于外层的全局锁。性能瓶颈:全局锁成为并发访问的瓶颈。隐藏风险:若用户绕过标准库(如自定义分配器),直接操作堆管理器,会触发崩溃。理解这些底层机制后,开发者可根据场景选择合适的分配器(如jemalloc),并在应用层优化内存使用模式,从而避免多线程环境下的堆管理问题。

2025-06-21 18:26:54 1101

原创 关于Eigen字节对齐

场景9211D解决方案工具/指令结构体含Eigen成员堆分配自动对齐STL容器或栈上大对象显式强制对齐动态内存配对性能临界区手动NEON内联+地址对齐检查vld1q_f32实测数据:在9211D(Cortex-A7)上,正确处理对齐后,NEON加速使矩阵运算性能提升2.5~3.8倍,同时避免90%的SIGBUS崩溃。调试时优先通过捕获未对齐访问。

2025-06-21 17:54:47 581

原创 进行曲线拟合后,计算电池电量时,对计算结果的离群检测

滑动窗口维护了一个固定大小的历史数据队列,每当有新数据到来时,将新数据加入队列,并移除队列中最早的数据,保证窗口内的数据始终是最新的。在电池充电过程中,我们可以将采集到的电池电量数据依次传入 OutlierDetector 类的 process 函数中,当检测到离群点时,丢弃该数据点,从而保证电池电量数据的合理性和递增趋势。通过这种方式,我们可以有效地检测并丢弃电池电量数据中的奇异点,使得电池电量数据更符合实际的递增趋势,为后续的电池状态分析和管理提供更可靠的数据支持。// 计算窗口数据的平均值。

2025-06-19 20:12:27 434

原创 CPU中断频繁导致红外信号失真:问题分析与解决方案

频繁的CPU中断会导致红外信号时序偏差,引发波形畸变、通信失败等问题。根本原因在于中断抢占信号生成、过长中断处理时间以及内核调度延迟。解决方案包括:优化中断处理(合并中断、分离ISR、屏蔽无关中断);硬件优化(使用PWM定时器、DMA传输);软件架构改进(RTOS高优先级任务、用户态驱动)。通过逻辑分析仪测量和压力测试可验证优化效果,结合软硬件协同设计可确保信号稳定性。

2025-05-29 21:35:54 986

原创 深入分析日志格式错误导致的随机崩溃问题

日志格式错误引发的崩溃犹如“薛定谔的 Bug”——崩溃位置随机,难以追踪。通过理解栈操作机制、强化代码规范、利用工具防护,方能从根本上规避此类问题。每一次格式化字符串的书写,都是对程序生命的一次郑重承诺。

2025-04-27 16:29:45 353

原创 深入理解 GCC 的`__attribute__`扩展

是 GCC 和兼容编译器提供的强大特性,可以帮助开发者编写更安全、更高效的代码。然而,需要注意的是,这些属性是编译器特定的,可能不被所有编译器支持。在使用时,需要根据目标编译器和平台进行适当的选择和调整。,它允许开发者在声明时为函数、变量或类型添加特定的属性。这些属性可以用来控制编译器的行为,包括优化、代码生成、警告和错误检查等。在 C 和 C++的开发中,GCC 编译器提供了一种强大的特性,称为。扩展有一个更深入的理解,并在你的项目中有效地利用这些特性。是一个或多个属性的列表,每个属性之间用逗号分隔。

2025-04-27 13:33:09 242

原创 解决C++日志宏的格式字符串安全问题:从运行时崩溃到编译时拦截

改进点原始代码风险改进后效果格式字符串检查❌ 运行时崩溃✅ 编译时报错拦截缓冲区安全❌ 可能栈溢出✅ 长度精确控制维护成本高(依赖人工检查)低(自动化工具辅助)

2025-04-27 11:43:01 619

原创 错误的格式说明符如何导致程序崩溃:以32位系统下`%ld`打印`int64_t`为例

行为错误示例(%ld正确示例(%lld或PRId64读取int64_t读4字节,指针移动不足读8字节,指针正确移动后续参数位置栈指针错位,访问非法内存栈指针正确,读取真实参数结果数据错误或崩溃正确输出格式说明符是printf与内存交互的契约。类型不匹配会破坏栈的完整性,轻则输出错误,重则程序崩溃。通过使用标准类型宏、编译器警告和静态分析工具,可有效避免此类问题。

2025-04-27 10:32:22 468

原创 在 32 位系统中使用 `%lu` 打印 `uint64_t` 的危害

在 32 位系统中,使用%lu打印uint64_t类型的数据会导致数据截断和未定义行为,这可能引发严重的程序错误。因此,务必使用正确的格式化说明符%llu或提供的宏来打印uint64_t类型的数据,确保程序的正确性和健壮性。

2025-04-25 22:03:27 407

原创 机器人系统从64位迁移到32位时的LOG崩溃问题分析与解决方案

永远不要假设long的位数即使是"临时调试代码"也要使用标准类型启用编译器警告日志模块要特殊处理// 建议封装安全打印接口代码审查要点printfsprintf中的%l格式符可变参数函数中的整数参数网络协议包的调试打印。

2025-04-25 21:58:54 606

原创 上位机版本差异引发的设备停机问题记录

通过及时的软件升级、协议更新和充分的测试,我们可以避免类似的通信错误,确保设备稳定运行。通过这次经历,我们团队对上位机和设备间的通信有了更深的理解,并采取了相应的措施来防止未来发生类似问题。• 版本差异:上位机软件的V1.2.3版本在下发连接状态时间时,使用了一种新的数据格式,而设备固件FW 4.5.6尚未更新以识别这种格式。• 软件升级:将上位机软件升级到与设备固件兼容的版本,或者将设备固件升级到能够识别新格式的版本。• 测试:在更新软件或协议后,进行充分的测试以确保新旧版本间的兼容性。

2025-04-22 17:08:51 198

原创 线程局部存储(TLS):原理、优缺点及使用示例

为了减少线程之间的竞争条件并提高程序的并发性能,线程局部存储(Thread Local Storage,TLS)提供了一种机制,允许每个线程拥有独立的变量副本。线程局部存储(TLS)是一种强大的机制,用于为每个线程提供独立的变量副本,从而避免线程之间的数据共享和竞争条件。• 由于每个线程都有独立的变量副本,访问和修改变量时不需要加锁,减少了线程同步的开销,从而提高了程序的性能。• 每个线程都有自己的变量副本,这可能会增加内存的使用量,尤其是当变量较大或线程数量较多时。线程局部存储(TLS)的原理。

2025-04-17 15:09:43 383

原创 当detach线程销毁失败时,coredump堆栈指向异常的深层解析

在多线程编程领域,线程资源回收始终是开发者需要谨慎处理的难题。当detach线程的销毁过程出现异常时,崩溃转储文件中的堆栈信息可能呈现出令人困惑的指向性。本文将深入剖析两种典型场景下的崩溃机理,揭示堆管理器在其中的关键作用。

2025-04-17 15:01:27 530

原创 IMU姿态解算算法对比:DCM、卡尔曼与扩展卡尔曼(C++实现)

C˙bn=Cbn⋅[ωibb×] \dot{C}_b^n = C_b^n \cdot [\omega_{ib}^b \times] C˙bn​=Cbn​⋅[ωibb​×]{预测:x^k−=Fkx^k−1更新:Kk=Pk−HT(HPk−HT+R)−1 \begin{cases}预测:\hat{x}_k^- = F_k \hat{x}_{k-1} \\更新:K_k = P_k^- H^T (H P_k^- H^T + R)^{-1}\end{cases}{预测:x^k−​=Fk​x^k−1​更新:Kk

2025-03-27 20:36:31 993

原创 C++ 内存对齐四大核心问题解析

SIMD寄存器(如SSE/AVX)要求连续内存块严格对齐,否则触发硬件异常。掌握这四大核心问题的应对策略,即可在性能优化与系统稳定性之间找到最佳平衡点。时,显式对齐具有正向收益。

2025-03-18 15:25:25 1010

原创 字节对齐问题导致类构造函数崩溃的原理及解决方法

某些库(如 Eigen)要求特定数据类型必须分配在特定对齐的内存地址(如 16 字节对齐)。若未使用对齐内存分配接口(如。编译器为优化内存访问效率,会根据数据类型的大小和平台要求自动插入填充字节。类型通常需要 4 字节对齐,若其地址不是 4 的倍数,访问时可能触发硬件异常。),构造函数中动态创建对象时会导致未对齐访问。

2025-03-18 13:21:41 318

原创 机器人系统崩溃问题深度解析——单例陷阱与串口通信的致命交互

某机器人系统在启动时出现以下两类异常:场景一:场景二:通过日志分析和代码审查,最终定位到关键问题:排查步骤崩溃堆栈分析:条件对比测试:资源监控:致命组合:多线程同时调用构造函数依赖未完全初始化的串口资源2. 串口资源双重绑定资源冲突示意图:结果:未初始化的内存被访问(野指针)串口缓冲区被错误改写3. 看门狗机制的掩盖效应场景一特殊表现解析:关闭串口时,构造函数跳过串口初始化单例初始化时序冲突被规避看门狗重启后,单例已存在,直接复用解决方案

2025-03-09 17:17:05 978

原创 深入理解 termios 配置:禁用输入字符转换

在某些应用场景中,你可能需要精确控制输入数据的格式,不希望系统自动对输入字符进行转换。例如,在串口通信中,发送方和接收方可能需要严格按照特定的协议来交换数据,任何自动的字符转换都可能导致数据格式错误或丢失。在这个示例中,我们首先打开串口设备,然后配置串口属性,包括波特率、字符大小、停止位以及禁用输入字符转换。标志,你可以精确控制输入数据的格式,避免自动字符转换带来的问题。提供了丰富的选项来控制终端的各种行为,包括输入和输出的处理方式。结构中包含了多个字段,每个字段控制终端的不同方面。

2025-02-08 10:45:03 228

原创 关于linux应用程序的GCC兼容问题探讨

linux应用程序的GLIBC兼容问题探讨

2024-10-21 15:19:09 817 1

原创 windows客户端的ARM64国产化适配

windows qt的国产化操作系统适配

2024-10-21 14:55:08 1703

原创 基于tcp的简单http服务接口实现(POST http://ip:port/test)

简单http server

2023-12-05 08:55:08 616

原创 zip/unzip源码交叉编译

修改unzip60/unix/Makefile。修改zip30/unix/Makefile。

2023-03-28 11:51:41 609

转载 VScode shell脚本编程

vscode shell脚本编程插件

2023-02-15 15:48:14 2414

转载 【无标题】

Linux挂载nfs教程

2023-02-15 09:02:15 244

转载 SqlDataReader和SqlDataAdapter的区别

SqlDataReader 高效,功能弱,只读访问SqlDataAdapter 强大,要求资源也大一点SqlDataReader 只能在保持跟数据库连接的状态下才可以读取。。。SqlDataAdapter 大多情况下是一次性读取一个表,然后填充到DataSet中,然后就可以断开跟数据库的连接了。两者区别主要是 在线 和 离线 的区别。。。。。一:SqlDataReader rd;rd=cmd.ExecuteReader();比较高效,如果只是显示数据,当然要用这个二:SqlDataA

2021-04-09 10:03:29 646

转载 数学建模评价模型

数学建模评价模型#参考https://wenku.baidu.com/view/6391dd0116fc700abb68fcaa.html

2020-12-19 15:04:45 556 1

原创 深度搜索优先之回溯算法

深度搜索优先之回溯算法力扣第1415题题干:解题思路:1,套用DFS模板2,利用递归实现回溯3,先深度遍历,符合条件使n减1,递归调用helper函数,直至n为0,说明已遍历完第一个开心字符串,此时使k–4,当k为1时,res即为结果。...

2020-11-22 09:25:24 190

原创 关闭winform窗体后的ThreadAbortException中断异常

解决关闭winform窗体后的ThreadAbortException中断异常原因:在启动了多个线程,程序关闭时没有先关闭线程,而直接使用abort强制关闭线程的话,会出现中断异常。解决办法:一,事先关闭所有已知线程,此方法前提是开发者自己清楚开启了多少线程二,将主线程设置为后台线程,当主程序关闭时,主线程会随之关闭,此时正在执行的线程也会关闭。参考自https://blog.csdn.net/yizhu2000/article/details/2022264...

2020-11-17 21:41:26 488

原创 关于unity3D shader的UV理解

**关于unity shader的UV的理解**定义:摘自其他博主的定义:对于三维模型,有两个最重要的坐标系统,一是顶点的位置(X,Y,Z)坐标,另一个就是UV坐标。什么是UV?简单的说,就是贴图影射到模型表面的依据。 完整的说,其实应该是UVW(因为XYZ已经用过了,所以另选三个字母表示)。U和V分别是图片在显示器水平、垂直方向上的坐标,取值一般都是0~1,也 就是(水平方向的第U个像素/图片宽度,垂直方向的第V个像素/图片高度)。那W呢?贴图是二维的,何来三个坐标?嗯嗯,W的方向垂直于显示器表

2020-05-09 09:55:08 3452

qt 5.9.6 源码免费

qt 5.9.6 源码免费

2023-11-17

linuxdeployqt源码

linuxdeployqt源码

2023-11-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人