2011-09-19 40 views
0

我的程序崩溃和一个对话框显示这个读取访问冲突异常是什么原因造成的?

"Unhandled exception at 0x3aaf1aea (pmsqlsrv.dll) in java.exe: 0xC0000005: 
Access violation reading location 0x3ac60880." 

报表中显示为导致崩溃是

m_pDatabase->m_pIDBCreateCommand->CreateCommand(); 

在监视窗口,在事故中所示

"this" pointer value for the containing object is 0x7395fcaf 
m_pDatabase         is 0xffff8810 (does it look like a valid address?) 
m_pDatabase->m_pIDBCreateCommand    CXX0030: Error: expression cannot be evaluated 

的地址对话框 - 0xC0000005和0x3ac60880我不知道它们是什么。这是否意味着dll(pmsqlsrv.dll)本身已损坏,崩溃是在读代码段而不是访问数据?

+0

指针m_pDatabase或m_pIDBCreateCommand中的一个指针可能并不指向您认为的位置,但在问题中没有足够的信息来回答该问题。 – Snips

回答

0

在32位Windows中,地址0xC0000000及以上是为内核保留的。内核地址空间通常在0x80000000开始。所以这个地址确实看起来不健康。

0

0xC0000005是内核的“段错误”中断异常处理程序的地址:它在尝试访问不属于您的进程的内存地址时被调用。

您的m_pDatabase指向0xffff8810(非常奇怪的内存地址:指向静态数据区...是否正确初始化?) 由于它很可能不是一个有效的地址,它包含一些无意义的值,使程序相信在m_pIDBCreateCommand(可能是一个随机值)中有一些东西要获取函数调用的地址。这使得它在两个或三个间接寻址之后可以访问其进程边界之外的内存。

查看m_pDatabase如何在程序中初始化,分配和更改。

+0

“这个”对象本身似乎无效,因为它的许多成员在监视窗口中显示为“”。但是内存错误检测工具在崩溃点之前没有显示错误,只有在崩溃点出现“无效读取”。我可以采取什么方法来查找指针如何失效?我试图在崩溃的语句之前将这个指针值写入文件,但即使控件应该通过这些行,它甚至不会写入文件。 –

+0

问题是此对象具有无效的内容,但其地址适合您的流程边界。因此形成记忆检测工具它有充分的存在权利。 在缓冲区溢出堆栈展开期间,它可能被别的东西覆盖。不容易察觉那些情况。 如果可以在值上设置断点,请尝试标识对象本身有效的执行点,并检查它何时发生更改。 –