访问冲突可能是伪装的内存不足错误吗?

问题描述 投票:0回答:3

我正在调试 64 位 C++(托管)故障转储(访问冲突)。

转储的总大小为 32.374.535 kb。

应用程序是多线程的,相应的调用堆栈只提到

mscvrt.dll!memcpy
(我不知道哪个其他线程正在创建这个)。显然没有对应的源码。

Visual Studio

Locals
窗口是空的。

未处理的异常提到了

Access violation writing location 0x000000F02A6BB000
,但是在那个位置,似乎什么都没有:

0x000000F02A6BAF84  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..............................................................
0x000000F02A6BAFC2  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..............................................................
0x000000F02A6BB000  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??  .............................................................. <= here it is.
0x000000F02A6BB03E  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??  ..............................................................

我看不出有任何理由解释为什么在此内存位置上写入会导致任何问题,因此我相信(基于转储的大小)我正在处理内存错误(这意味着不可能将某些内容复制到内存,因为已经使用了太多内存,没有剩余空间)。但是,如果这是真的,那么该内存位置中不应该有一些信息吗?

有人对此有想法吗?

c++ memory-management access-violation memcpy crash-dumps
3个回答
1
投票

直观上,在我看来,这不像是内存不足错误。一些设计不佳的操作系统上的内存分配系统服务在分配内存失败时会返回成功值。尽管Windows有很多缺陷,但我不相信它是这样的系统。如果您运行的系统确实执行某种延迟分配,那么我会怀疑您的怀疑。

我认为内存溢出导致写入尚未映射到地址空间的页面。


1
投票

如果不查看源代码,就无法知道如果遇到内存不足错误它会做什么。当然有很多程序不会检查每个内存分配是否失败,因此它们的代码可能会完全脱轨。

未检查的内存不足错误的最常见结果是访问冲突,但它通常位于非常小的地址或其中存在一些明显无意义的模式。这是因为许多内存分配函数在内存不足时返回零,并且检查失败可能会导致访问返回值附近的地址。此外,某些函数会使结果未初始化并返回单独的错误。未能检查该错误可能会导致使用未初始化的值来访问内存,这通常看起来很奇怪。

这里的地址看起来很合理。但谁知道呢。也许代码分配一个新的缓冲区,释放旧的缓冲区,然后将旧地址切换为新的缓冲区,但在发生错误时,不会切换地址,但会释放旧地址,从而导致释放后进行访问。没有源代码,就无从得知。


0
投票

访问冲突实际上有可能是内存不足错误(或其他类型的内存相关错误),正如 Scheff 和 Peter 的评论中提到的。

在这种特殊情况下,转储的大尺寸 (±33Gb) 表明该应用程序(与其他应用程序一起)可能消耗过多内存。

© www.soinside.com 2019 - 2024. All rights reserved.