如何解决访问冲突? 目前,C++编写的程序中有一个异常,在Windows下运行。
以下是日志中的最小转储信息如何解决访问冲突? 目前,C++编写的程序中有一个异常,在Windows下运行。,c++,exception,C++,Exception,以下是日志中的最小转储信息 08/12/15 04:37:19 I New Information for UID 2d936a, FloorLoc F1505 08/12/15 04:37:19 E >>>>> EXCEPTION: Access Violation while trying to read address 20203567 [Fault address: 004AF945 01:000AE945 C:\Program Files (x86)
08/12/15 04:37:19 I New Information for UID 2d936a, FloorLoc F1505
08/12/15 04:37:19 E >>>>> EXCEPTION: Access Violation while trying to read address 20203567
[Fault address: 004AF945 01:000AE945 C:\Program Files (x86)\MySystems\WPR.exe 00400000] <<<<<
Call stack:
Load addr Address Frame Logical addr Module
00400000 004AF945 0588F8CC 0001:000AE945 C:\Program Files (x86)\MySystems\WPR.exe
00400000 004A89A4 0588FAEC 0001:000A79A4 C:\Program Files (x86)\MySystems\WPR.exe
似乎m_elem
从new
操作符获取一个地址,并且SetLocation
函数调用也不例外。此外,还应确保以下日志输出正确
为什么从SetValue0
抛出一个异常?这里是函数SetValue0
void SetValue0(INDEX idx, DWORD val)
{
if (idx >= 0 && idx < MAX_INDEX){
if(val != m_Info[idx])
{
m_Info[idx] = val;
}
}
}
这类问题有点难回答。我在评论中提出了一些想法,我将在这里详细阐述。以下是我在没有其他线索的情况下,在这些崩溃日志中寻找的东西 在该位置读取时的访问冲突表明以下情况之一:
不是有效的指针,尝试从中获取TempMSE
时引发异常m_elem
无效,当尝试测试TempMSE->m_elem
的值时,会在m_Info[idx]
内部引发异常SetValue0
TempMSE->m_elem
,但不将其设置为NULL,则可能会发生这种情况。如果另一个线程负责该删除,那么这里可能有一个争用条件,它将被设置为NULL,但首先执行该代码
另一种可能是TempMSE
或TempMSE->m_elem
在过程中的某个地方被损坏。这可能是由于TempMSE
内部的缓冲区溢出(如果您有数组),或者基本上是内存中这些指针附近发生的任何类型的未定义行为造成的。如果堆栈上有TempMSE
,则查找是否存在任何潜在故障
我不想用其他类型的推测(比如堆损坏)来填充这个答案,但希望它能为您提供一些尝试的途径。常见罪犯的基本名单如下:
- 编码错误(未初始化或重置值)
- 线程问题、争用条件
- 未定义的行为或溢出破坏数据
祝你好运 我说不出什么是真正的错误,但我会在
0x004AF945
处反汇编代码以及之前的几个指令,并尝试了解失败函数的哪一部分
正如其中一条评论中指出的,发生故障的地址看起来可疑地像'C#'
,这让我觉得某个地方有一个字符串溢出了
这只是一个猜测,但我怀疑
TempMSE->m_elem
是包含值0x20203567
的内容,因此当它尝试访问它时,它不是NULL
,这意味着不执行日志记录。[显然,这是基于您迄今为止显示的代码,如果之前/之后有日志显示情况并非如此,我的第二个猜测是,m_info
在某种程度上是错误的…如果TempMSE
或TempMSE->m_elem
不是有效地址,或指针悬空。例如,未初始化或已删除,并且未设置为NULL,或者如果对象内的某个位置的缓冲区溢出中出现了m_elem
。“20203567”看起来像ASCII字符。是否检查m_elem
指针是否指向(可写)RAM而不是一些只读常量数据?@harper,你的意思是通过new Element
检查指针返回?你没有调试器吗?@paddy,即使m_elem`是悬空指针,它也只从new
操作符获得一个新地址,这让我很困惑。(小端)20203567
是“c5”
,而不是“c#”
。
void SetValue0(INDEX idx, DWORD val)
{
if (idx >= 0 && idx < MAX_INDEX){
if(val != m_Info[idx])
{
m_Info[idx] = val;
}
}
}
class Element {
// other function here...
private:
FloorLocation m_FloorLoc;
DWORD m_Info[MAX_INDEX];
bool m_Dirty;
};
Element::Element(const Element& elem) {
m_FloorLoc = elem.m_FloorLoc;
for (int i = 0; i < MAX_INDEX; ++i)
m_Info[i] = elem.m_Info[i];
m_Dirty = elem.m_Dirty;
}
class FloorLocation {
// other function here...
private:
FloorId m_floorloc;
};
FloorLocation::FloorLocation( const FloorLocation& loc )
{
memset(&m_floorloc, ' ', 8); // space filled
if(loc.m_floorloc.id[0] != 0)
{
memcpy(m_floorloc.id, loc.m_floorloc.id, 8);
// eliminate nulls
for(int ndx=0; ndx < 8; ndx++)
{
if(m_floorloc.id[ndx] == 0)
m_floorloc.id[ndx]=' ';
}
}
}
typedef struct {
char id[8];
} FloorId;