在 EnterCriticalSection() 上抛出的访问读取冲突
Access Read Violation thrown on EnterCriticalSection()
我正在开发一个多线程应用程序,它使用关键部分来同步实体数组。该数组保存在一个结构中,如下所示。 pe 数组的每个成员都包含自己的 criticalSection,它总是在访问该成员之前声明(我已经检查了它们)。
struct PlayerEntity {
DWORD state;
BOOL onScreen;
DWORD team;
DWORD_PTR baseAddr;
BOOL valid;
CRITICAL_SECTION critSec;
};
struct EntityList {
DWORD count;
PlayerEntity pe[128];
};
EntityList *getStaticEntityList() {
static EntityList entityList;
return &entityList;
}
启动应用程序后,两个线程之一在尝试进入临界区时会随机抛出异常(如下)。
Exception thrown at 0x00007FFC8813E7C5 (ntdll.dll) in RustExp.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
我假设此错误是由试图访问其 DebugInfo 对象的临界区对象引发的,因为每个对象的 DebugInfo 指针在初始化后都指向 0xffffffffffffffff。但是在错误检查之后,它们都指向 0xcdcdcdcdcdcdcdcd。
我试图查找有关临界区对象及其成员的信息,但我似乎无法找到有关它们的任何信息。所以我问,初始化的关键部分对象是否应该将其 DebugInfo 指向 0xffffffffffffffff 以及关键部分何时尝试访问其 DebugInfo(从而引发读取错误)?
注意:这是 运行 在 Windows 10.
我错误地取消了我的评论。但无论如何我做了检查,发现 DebugInfo 指针在关键部分初始化期间被初始化为一个有效地址,该地址在所有测试(进入和离开该部分)期间保持不变。
如果您在关键部分初始化期间没有任何错误,则应该正确初始化它,因此您不能在那里 0xFFFFFFFFFFFFFFFF
。
这只能得出一个结论,问题必须在代码其他地方发生的内存损坏中搜索。
我正在开发一个多线程应用程序,它使用关键部分来同步实体数组。该数组保存在一个结构中,如下所示。 pe 数组的每个成员都包含自己的 criticalSection,它总是在访问该成员之前声明(我已经检查了它们)。
struct PlayerEntity {
DWORD state;
BOOL onScreen;
DWORD team;
DWORD_PTR baseAddr;
BOOL valid;
CRITICAL_SECTION critSec;
};
struct EntityList {
DWORD count;
PlayerEntity pe[128];
};
EntityList *getStaticEntityList() {
static EntityList entityList;
return &entityList;
}
启动应用程序后,两个线程之一在尝试进入临界区时会随机抛出异常(如下)。
Exception thrown at 0x00007FFC8813E7C5 (ntdll.dll) in RustExp.exe:
0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
我假设此错误是由试图访问其 DebugInfo 对象的临界区对象引发的,因为每个对象的 DebugInfo 指针在初始化后都指向 0xffffffffffffffff。但是在错误检查之后,它们都指向 0xcdcdcdcdcdcdcdcd。
我试图查找有关临界区对象及其成员的信息,但我似乎无法找到有关它们的任何信息。所以我问,初始化的关键部分对象是否应该将其 DebugInfo 指向 0xffffffffffffffff 以及关键部分何时尝试访问其 DebugInfo(从而引发读取错误)?
注意:这是 运行 在 Windows 10.
我错误地取消了我的评论。但无论如何我做了检查,发现 DebugInfo 指针在关键部分初始化期间被初始化为一个有效地址,该地址在所有测试(进入和离开该部分)期间保持不变。
如果您在关键部分初始化期间没有任何错误,则应该正确初始化它,因此您不能在那里 0xFFFFFFFFFFFFFFFF
。
这只能得出一个结论,问题必须在代码其他地方发生的内存损坏中搜索。