2013-09-16 136 views
6

所以這是非常奇怪的,可能有一個非常簡單的解釋,但我使用的是一臺機器,我通常沒有使用工廠默認安裝的VS下面的代碼正是我正在運行的,並且它導致這個熟悉的消息:系統(「暫停」)導致堆損壞

Windows已觸發ProjectB.exe中的斷點。

這可能是由於堆損壞引起的,這表明ProjectB.exe或其中已加載的任何DLL的錯誤。

這也可能是由於用戶在ProjectB.exe具有焦點時按下F12。

輸出窗口可能有更多診斷信息。

的代碼是:

#include <iostream> 
#include <cstdlib> 
using namespace std; 

int main(int argc, char** argv) 
{ 
    system("pause"); 
    return 0; 
} 

這就是它!沒有更多,只有一個文件。註釋掉系統(「暫停」)不會觸發中斷,但我無法阻止程序退出(如您所期望的)。所以我很困惑。這對我來說似乎很奇怪,因爲我以前從未遇到過這種情況,我不明白爲什麼會導致問題。使用另一個不停止進程的系統命令(如system(「cls」))也不會導致問題。我的傾向是,這是特定於我正在工作的機器,但我不確定。提前致謝!

任何幫助表示讚賞。

[編輯]

所以我從來沒有調試到標準頭文件(至少不是故意)之前,但我注意到一兩件事:

__crtCorExitProcess調用加載mscoree.dll中模塊返回一個空的句柄,意味着它沒有加載。我不確定這是否是正常情況,但是這樣做會跳過一段獲取exit proc函數指針的代碼。在調用此方法之後,調用ExitProcess被調用,並且從這裏觸發中斷。

[EDIT 2]

在輸出窗口中產生呼叫的system("pause")後的以下內容:在ProjectB.exe在0x750cc41f 第一次機會異常:微軟C++異常:> log4cxx ::助手: :IOException在內存位置0x006ff1fc .. ProjectB.exe中0x750cc41f的第一次機會異常:Microsoft C++異常:> log4cxx :: helpers :: IOException在內存位置0x006ff344 .. SPLogger:setFile(C:\ ProgramData \ Safend \ Logs.18698 \ SPHook.log,true)調用失敗。 SPLogger:IO異常:狀態碼= 720005 SPLogger:沒有爲名爲[SPHookLog]的appender設置輸出流或文件。

然後當ExitProcess的被調用時,這個被添加到輸出窗口:

線程 '的Win32線程'(0x1ca8)已經退出,代碼0(爲0x0)。 HEAP [ProjectB。exe]:HEAP:免費堆21a4ba8在21a4c10修改後釋放

這對我很好奇。

+1

請注意,''不能保證包含C頭文件,所以''實際上是必需的。但這不應該是錯誤的根源。 –

+0

謝謝;我添加了 include,這也沒有解決問題。 –

+2

這聽起來像一個運行時庫不匹配給我。 –

回答

1

我認爲這裏的問題是存在防止某些DLL被加載和/或注入代碼以防止惡意指令被執行的安全軟件運行。因爲我從來沒有在個人機器上體驗過這種情況,只有在安全管理很多的公司機箱上才能體驗到這一點,我認爲是這樣。我懷疑這是一個運行時不匹配,因爲沒有別的產生意想不到的結果。謝謝大家對潛在問題發表評論!如果您遇到此問題,請閱讀評論,因爲此處討論了其他潛在問題。