【发布时间】:2019-01-16 09:27:42
【问题描述】:
我正在调试 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 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ..............................................................
我看不出为什么在这个内存位置上写入会导致任何问题,因此我相信(基于转储的大小)我正在处理内存错误(这意味着无法复制一些东西进入内存,因为已经使用了太多内存,没有空间了)。但是,如果这是真的,那内存位置不应该有一些信息吗?
有人知道吗?
【问题讨论】:
-
写入(甚至读取)您不“拥有”的内存会导致未定义的行为。如果没有来源,真的很难找到问题以及导致问题的原因。无论如何,也几乎不可能修复它。至于猜测可能的原因,可能是使用了未初始化的局部指针变量?
-
所有
??让我觉得这个地址的内存不属于被调试的进程。 (即使调试器也不愿意或无法读取它。)所以,这看起来真的像“访问冲突”。 -
@Scheff:“不属于被调试的进程”是什么意思?我认为,在 Windows 中,每个进程都有权不受限制地使用每一块空闲内存来完成其工作(当然,除非计算机内存不足)。你能确认一下吗?我在哪里可以找到相关信息?
-
内存可以写保护。此外,如果调用堆栈上唯一的东西是
memcpy,那么您可能已经严重破坏了堆栈。 -
绝对不是。每个进程都必须从操作系统(Windows 内核)请求内存块。之后它可以独占地读/写访问这个内存。整体内存的其他部分必须是不可访问的。这是为了保护进程免受彼此的影响。 Wikipedia: Memory Protection
标签: c++ memory-management access-violation memcpy crash-dumps