2012-04-24 76 views
0

在一段時間之前,我編寫了自己的小數據庫編輯器程序,我使用Win API編寫了它的零代碼,所以它不是很小的項目。 到目前爲止,它在所有操作系統上工作正常,我有Win 7 x64的所有最新更新和我的應用程序崩潰0xC000005異常,因爲一些堆功能(HeapAlloc或HeapFree,我什麼也沒有使用),我試圖更換HeapAlloc &與VirtualAlloc和VirtualFree的堆免費,這一切都很好,但我不想使用虛擬內存.... 別的,我試圖附加調試器來追蹤問題,但是當我附加調試器它不崩潰,然後我試圖顯示MessageBox來跟蹤它崩潰的地方,但是當我顯示MessageBox時它並沒有崩潰......HeapAlloc導致消失 - Windows 7 x64

我的應用程序以32位進程運行。 編碼在C.

任何人都有類似的問題?

回答

1

首先,HeapAllocVirtualAlloc分配虛擬內存。

我對所發生的事情的猜測是你正在寫入已分配內存的邊界。這與HeapAlloc無效的原因是,它分配的內存量與您請求的內存量完全相同。使用VirtualAlloc時,返回的大小是請求的大小,向上舍入到下一頁邊界。在你的情況下,這給了更多的迴旋餘地(即使你的代碼仍然在做錯事)。

至於爲什麼它一直工作到目前爲止:你只是幸運。仔細查看訪問分配內存的代碼,如果卡住了,請將相關部分放在此處。如果調試器沒有幫助,並且該錯誤很容易重現,那麼只需註釋部分代碼,直到找到導致崩潰的行。

+0

從評論它看起來像我真的寫出來的分配內存的線,但它不看可能給我,我增加了分配內存的大小了很多,所以它的,足夠的預,但仍然同樣的事情,它適用於所有操作系統,它可以在沒有最新的補丁的其他Win7 x64上運行,但它不適用於我的更新到最新的補丁。 – VisaToHell 2012-04-24 23:24:38

+1

沒有任何方法可以幫助我們進一步看到一些代碼。嘗試繼續評論較小的塊,直到找到從分配的內存中寫出的行。無論如何,這聽起來像你很接近。關於它在某些情況下工作,你真的依賴於未定義的行爲,所以任何事情都可能發生。 – 2012-04-24 23:33:34

1

你是否已將它附加到應用程序的Debug版本中?如果問題沒有出現在調試版本中,那麼你應該檢查哪些警告(在最高級別)生成你的代碼,也許你會發現一些未初始化的變量。如果沒有在這裏,那麼你可以使用一些靜態分析工具來幫助發現錯誤 - 比如PVS-Studio http://www.viva64.com/

您也可以在啓用了調試信息的情況下編譯發佈版本,這樣當問題出現時,您應該能夠使用調試器附加到您的應用程序並查看帶有函數名稱的callstack。爲了更容易調試,禁用代碼優化。

您也可以嘗試windows調試工具中的gflags,這個程序每次在緩衝區邊界之外寫入時都會觸發斷點。這真是有用的工具,因爲並不是所有的緩衝區溢出都會以異常結束。在啓用調試信息的應用程序上使用它,最好關閉代碼優化。要爲您的應用啓用gflags,請使用:

gflags/p/enable myapp.exe/full (http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff543097%28v=vs。 85%29.aspx)