2011-09-19 71 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

問題是此對象具有無效的內容,但其地址適合您的流程邊界。因此形成記憶檢測工具它有充分的存在權利。 在緩衝區溢出堆棧展開期間,它可能被別的東西覆蓋。不容易察覺那些情況。 如果可以在值上設置斷點,請嘗試標識對象本身有效的執行點,並檢查它何時發生更改。 –