首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于内存越界的问题

后来在网上查了许多资料,基本上定位是内存地址越界引起,只是不知道具体的越界地点。      ...当时我做的第一个措施是把所有的sprintf、memcpy,strcpy等相关容易出现内存地址越界的函数都检查了一遍,都加了防御代码,不过遗憾的是问题不是出在这些地方。崩溃问题依旧。      ...分析代码尝试解决失败,只能依赖工具,尝试了valgrind等几乎所有linux下的内存检查工具,但是这些工具都有一个致命的缺陷,我们的服务器程序太臃肿了,跑起来非常卡,连正常启动加载运行时10秒就能完成的任务...战斗后台使用的是状态机来实现的,上面的代码是最后一个状态中关闭战斗的语句,在closeFight里面会将所有的状态delete掉,包括这段代码所在的状态,然后后面的给m_fight赋值为NULL就造成了非法写内存...通过这件事情,我总结一下,在解决linux崩溃这些疑难杂症上,必须分析代码+使用工具,代码分析是我的强项,但是使用工具这方面我还有待加强,而且不能急躁,要多一点耐心,多一点坚持,问题一定能解决。

1.5K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux C++ 使用valgrind 检查内存泄漏

    我的环境是ubuntu 使用发行版的自带的源中安装 sudo apt install valgrind 然后运行一下 valgrind + 可执行命令 就可以 检查内存泄漏啦 ?...内存泄漏检测 主要看definitely lost:这里如果是0,说明没有会导致程序崩溃读的内存泄漏问题。 “definitely lost”:确认丢失。程序中存在内存泄露,应尽快修复。...当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存则会报这个错误。 “indirectly lost”:间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。...大多数情况下应视为与"definitely lost"一样需要尽快修复,除非你的程序让一个指针指向一块动态分配的内存(但不是这块内存起始地址),然后通过运算得到这块内存起始地址,再释放它。...当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。

    3.3K20

    在 Linux 下如何检查内存使用率

    在排查系统问题,或者应用变慢,或者不明原因问题时,第一件事就是要检查系统的内存使用率。 本文讲解如何在 Linux 中使用不同的几个命令来检查 RAM 内存使用率。...一、free 命令 free命令是检查一个 Linux 系统中内存使用率最常用的命令。它显示关于内存总量,已经使用的内存以及空闲内存的相关信息。...这个%MEM一列,提供信息包括每一个运行进程中被使用的共享内存占可用物理内存的比例。 三、 /proc/meminfo 最简单的检查 RAM 内存的方式就是去显示/proc/meminfo虚拟文件。...五、总结 我们已经向你展示一些命令,你可以使用它们来检查系统内存使用率。...原文 :https://linuxize.com/post/check-memory-linux/ 版权声明:本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

    9.7K20

    用以检查Linux内存使用的5个命令

    Linux 操作系统包含大量工具,所有这些工具都可以帮助你管理系统。从简单的文件和目录工具到非常复杂的安全命令,在 Linux 中没有多少是你做不了的。...而且,尽管普通桌面用户可能不需要在命令行熟悉这些工具,但对于 Linux 管理员来说,它们是必需的。为什么?首先,你在某些时候不得不使用没有 GUI 的 Linux 服务器。...或者,你可能需要收集有关 Linux 交换分区的信息,或者有关安装的内存的详细信息?对于这些也有相应的命令。让我们深入了解各种 Linux 命令行工具,以帮助你检查系统内存使用情况。...top 命令提供正在运行的系统的实时动态视图,它检查每个进程的内存使用情况。这非常重要,因为你可以轻松地看到同一命令的多个示例消耗不同的内存量。...你可能只需要查看系统的可用和已用内存。对此,Linux 还有 free 命令。

    97830

    如何在Linux中检查内存使用情况

    在对系统或应用程序速度减慢或行为异常进行故障排除时,首先要检查的问题之一是系统内存使用情况。 本文介绍了如何使用几种不同的命令来检查Linux中的RAM使用情况。...free命令 free是用于检查Linux系统内存使用的最常用命令。 它显示有关总内存,已用内存和可用内存的信息。...shared -可以忽略此列; buff/cache -内核缓冲区以及页面缓存和slab使用的组合内存。 如果应用程序需要,可以随时回收此内存。...它还显示了系统摘要,包括内存使用情况。 要调用命令,只需键入top: free -h 输出将如下所示: 输出的标头包含有关系统的总,可用和已用物理内存和交换内存的信息。...%MEM列提供有关每个运行进程的可用物理内存已用份额的信息。 /proc/meminfo 检查RAM内存使用率的最简单方法是显示/proc/meminfo虚拟文件的内容。

    5.8K30

    系统运维|Linux有问必答:如何检查Linux的内存使用状况

    问题:我想要监测Linux系统的内存使用状况。有哪些可用的图形界面或者命令行工具来检查当前内存使用情况? 当涉及到Linux系统性能优化的时候,物理内存是一个最重要的因素。...自然的,Linux提供了丰富的选择来监测珍贵的内存资源的使用情况。...下面是一个可供选择的,但并不全面的图形或命令行工具列表,这些工具用来检查Linux平台中已用和可用的内存。 1..../proc/meminfo一种最简单的方法是通过“/proc/meminfo”来检查内存使用状况。这个动态更新的虚拟文件事实上是诸如free,top和ps这些与内存相关的工具的信息来源。...它利用“按比例分配大小(PSS)”指标来精确量化Linux进程的有效内存使用情况。内存使用分析结果能够输出为柱状图或者饼图类的图形化图表。

    1.8K10

    数组的下标越界与内存溢出有关吗_数据量过大数组报下标越界

    不检查下标是否越界可以有效提高程序运行的效率,因为如果你检查,那么编译器必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降,所以为了程序的运行效率,C /...C++才不检查下标是否越界。...发现如果数组下标越界了,那么它会自动接着那块内存往后写。...而在Linux(CentOS6.5)里面运行时,就是我们开头说的那种下标越界的情况,不管你下标咋越界,我的编译器都不会对数组下标做边界检查。...这是在Linux(CentOS6.5)环境下,编译链接运行都可以,但程序停不下来,关闭终端时可以看到程序仍在进行。

    1.8K60

    宋牧春: Linux内核内存corruption检查机制KASAN实现原理

    前言 KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问题。功能比SLUB DEBUG齐全并且支持实时检测。...注:文章代码分析基于linux-4.15.0-rc3。 2. 简介 KernelAddressSANitizer(KASAN)是一个动态检测内存错误的工具。...KASAN使用编译时检测每个内存访问,因此您需要GCC 4.9.2或更高版本。检测堆栈或全局变量的越界访问需要GCC 5.0或更高版本。...不过我们可以作为产品发布前的最后检查,也可以排查越界访问等问题。我们可以查看内核日志内容是否包含KASAN检查出的bugs信息。 4. KASAN是如何实现检测的?...使用特殊的magic num填充shadow memory,在每一次load/store(load/store检查指令由编译器插入)内存的时候检测对应的shadow memory确定操作是否valid。

    2.3K10

    VC的内存泄漏检查

    ”,在“MFC中的内存泄漏检测”页面下方的相关章节中,可找到“检测和隔离内存泄漏”,它就是介绍如何使用 C 运行时库检测内存泄漏,链接就是上面那个链接。...并且这些方法,不仅C++的内存分配方式(如new)可用,C的内存分配方式(如malloc)也可用。..._heap_alloc_dbg_impl内部会真正分配内存,并且记录内存分配的文件名、行号、需要分配的内存大小及本次内存分配是整个程序第几次分配(在MSDN中叫“内存分配编号”,每调用_heap_alloc_dbg_impl...,但通常情况下,由于在调用new、malloc分配内存时,并没有把分配内存的文件名及行号传递给_heap_alloc_dbg_impl,所以检测到的内存泄漏并不能准确定位,对于实际开发,意义不大。...当程序结束时,_pFirstBlock会检测链表中未删除的内存,给出内存泄漏报告。 需要注意的是,并不是每个cpp文件中,都定义了DEBUG_NEW,尤其后添加的文件。 2.2 对于C分配的内存。

    1.8K40

    Postgresql中检测内存越界或use after free的简便方法

    1 使用场景 在Postgresql的内存管理模块中,最常用的aset.c提供的内存池实现,该实现提供了两个非常实用的开关来解决常见的内存越界问题: memdebug.c * About CLOBBER_FREED_MEMORY...简单总结如下: CLOBBER_FREED_MEMORY: 如果定义了这个符号,所有释放的内存都会被覆盖为0x7F。这对于捕捉引用已释放内存的地方非常有用。...因此,如果有人犯了常见的错误,超出了他们请求的范围,问题可能会被忽视…直到更换平台后,没有这种空间未使用空间,导致内存越界使用的问题才被发现。...但是如果你内存越界访问到第六个字节后,实际上是不会发生任何破坏的,因为这第六个字节也没有人会用,释放时也不可能发现。这就造成了隐患(这类问题都比较难差会有奇怪的逻辑报错)。...VALGRIND_MAKE_MEM_UNDEFINED(ptr, size); memset(ptr, 0x7F, size); VALGRIND_MAKE_MEM_NOACCESS(ptr, size); } 后面aset不会对0x7F做任何检查逻辑

    24540
    领券