C++堆内存越界问题调试

问题描述

C++堆内存越界问题调试

最近公司代码老是遇到glibc 断言死机,基本都是另外地方把这边内存踩了,另外地方的内存可能已经被覆盖或者释放后重用,这种情况要怎么查才能还原第一现场?死机一般都只有core文件和日志文件。我们用的是arm或x86嵌入式linux系统,内存一般1GB。 盼高手回复,万分感激!!!

解决方案

补充:嵌入式下用不了valgrind

解决方案二:

这种错误一般是你已有的两种数据结合处理。一个是core dump。用gdb等查看分析调用堆栈。找到出错的地方。如果不能直接找到可疑的的地方。就在那个地方添加自己重要的日志。重现问题。然后根据日志进一步分析

解决方案三:

第二现场一般都能定位到间接原因,关键是在那里加打印也没法捕获第一现场根本原因的,而且一般这种越界第二现场每次都不同地方的。具有随机性,用保护页内存也不行。

解决方案四:

期待高手回复啊,自己顶帖!

解决方案五:

高手在哪里,高手在哪里?!

时间: 2024-10-11 18:22:50

C++堆内存越界问题调试的相关文章

请问这是怎么回事?(有关内存越界)

问题描述 请问这是怎么回事?(有关内存越界) 以下是代码,进入后选择某些功能会出现以下警告: 有没有能帮忙改一下的,谢谢. include include include typedef struct link { char number[100]; char bookname[100]; char author[100]; char publish[100]; char time[100]; float price; char status[100]; struct link *next; }

智能指针问题-c++ 智能对象声明与堆内存,请明白人指点,谢谢

问题描述 c++ 智能对象声明与堆内存,请明白人指点,谢谢 定义 含有计数器的智能类模板如下: template class SmartObjectPtr { private: T* p; public: SmartObjectPtr(T* p_=NULL) : p(p_) { if (p) p->AddRef(); }; SmartObjectPtr(const SmartObjectPtr &p_) : p((T*)p_) { if (p) p->AddRef(); }; ~Sma

使用PageHeap.EXE或GFlags.EXE检查内存越界错误

必先利其器之一:使用PageHeap.EXE或GFlags.EXE检查内存越界错误 Article last modified on 2002-6-3 ---------------------------------------------------------------- The information in this article applies to: -        Microsoft Visual C++, 32-bit Editions, version 6.0, SP5

C++内存越界问题及解决方法

与内存泄露相比,C++最令人头痛的问题是内存越界,而内存越界很多情况下是由于悬挂指针引起的. 假设一个指针变量: Object * ptr; 使用ptr时,我们除了要判断ptr是否为0以外,还要怀疑它指向的对象是否有效,是不是已经在别的地方被销毁了.我们希望当它指向的对象被销毁时,ptr被自动置为0. 显然,C++没有这种机制,但是,可以借助于boost::weak_ptr做到这一点. inline void null_deleter(void const *) { } class X { pr

Java中的堆内存与栈内存分配浅析

Java 把内存划分成两种:一种是栈内存,另一种是堆内存.在函数中定义的一些基本类型的变量和对 象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量 分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以 立即被另作它用. 堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来 管理.在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量

C++中堆内存(heap)的概念和操作方法

堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作中,我们有时候却需要动态的为数组分配大小,在这里c库中的malloc.h头文件中的malloc()函数就为您解决了问题(bc或者是在老的标准中是alloc.h),它的函数原形是void* malloc(size_t size),在动态开辟的内存中,在使用完后我们要使用free()函数来释放动态开辟的内存空间. 下面我们来看一个完整的例子: //程序作者:管宁/

Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统

Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本书还嗷嗷待哺的等着我去看,github上的两个散漫的开源,基础入门的视频也在录制,还要学习新的知识, 都是一种挑战,不知道为何,最近懒散了,看来还得再加把劲,今天我们继续延伸一下C的一些小知识 一.数组 C的数组和JAVA也是类似的,我们写一段小程序 #include <stdio.h> #inc

Linux堆内存管理深入分析(上)

Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢出的漏洞利用资料就很少了.鄙人以为主要是堆溢出漏洞的门槛较高,需要先吃透相应操作系统的堆内存管理机制,而这部分内容一直是一个难点.因此本系列文章主要从Linux系统堆内存管理机制出发,逐步介绍诸如基本堆溢出漏洞.基于unlink的堆溢

Java中堆内存和栈内存详解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存