我正在调试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 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ..............................................................
我看不到任何在此内存位置进行写操作会引起任何问题的原因,因此,我认为(基于转储的大小)我正在处理内存错误(这意味着无法复制)内存中存储的内容,因为已经使用了太多内存,因此没有剩余空间了)。但是,如果这是真的,那该存储位置中是否应该有一些信息?
有人对此有想法吗?
答案 0 :(得分:1)
如果没有看到源代码,就无法知道如果遇到内存不足错误怎么办。当然,有很多程序不会检查每个内存分配是否失败,因此它们的代码可能会完全脱离正常轨道。
未检查的内存不足错误的最常见结果是访问冲突,但通常是在一个很小的地址或其中存在明显的荒谬模式的地址处进行的。这是因为许多内存分配函数在内存不足时会返回零,并且检查失败可能会导致访问返回值附近的地址。此外,某些函数会将结果保留为未初始化状态,并返回单独的错误。无法检查错误可能会导致使用未初始化的值访问内存,并且通常看起来很奇怪。
在这里,地址看起来很合理。但是谁知道。也许代码分配了一个新的缓冲区,释放了旧的缓冲区,并为新的缓冲区切换了旧地址,但是如果出错,则不切换地址,而是释放了旧地址,从而导致释放后的访问。没有源代码,就无法知道。
答案 1 :(得分:0)
正如Scheff和Peter的评论中所提到的,访问冲突实际上实际上可能是内存不足错误(或其他类型的与内存相关的错误)。
在这种特殊情况下,转储的大容量(±33Gb)表示该应用程序(以及其他应用程序)可能会消耗过多的内存。
答案 2 :(得分:0)
直觉上,它在我看来并不像是内存不足错误。在某些设计不佳的操作系统上的内存分配系统服务在分配内存失败时将成功返回值。像Windoze一样有许多缺陷,我不认为它是这样的系统。如果您在运行某种延迟分配的系统上运行,那么我会怀疑您所怀疑的。
认为,内存超限导致对尚未映射到地址空间的页面的写操作。