簡體   English   中英

_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)在C ++中崩潰

[英]_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) crash in C++

我有一個Qt GUI程序,在其中可以單擊一個按鈕來加載/卸載許多Dock小部件。 我有一個問題,當我單擊按鈕以加載/卸載擴展窗口小部件時,程序崩潰,並說

Debug Assertion Failed, Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

並非每次都發生。 (實際上很少發生。)當我檢查Windows的事件日志時,它說應用程序因交叉線程死鎖而掛起。 但是大多數在線人說_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)意味着內存錯誤。 我只是不知道發生了什么...

這是別人編寫的非常大的程序,並且很少發生該錯誤...現在我該怎么做才能找到該錯誤?

編輯:嗨,我有故障轉儲文件,並且我看到我的程序在調用堆棧的工作線程處停止:> ntdll.dll!_NtWaitForMultipleObjects@20()+ 0x15字節
我如何追溯到程序實際停止的源代碼?

這通常意味着您正在嘗試訪問std容器內的非法內存塊。

要正確調試它,只需在“ Call Stack窗口中查看Call Stack ,查找堆棧,直到獲得代碼,然后查看該值為何無效。

很難描述它,但是簡單地說,這是您應該做的:

安裝應用程序驗證程序並運行它。

Ctrl + A ,選擇您的可執行文件。

取消選擇右窗格中的所有測試,僅選擇“基本”->“堆”。

確保已啟用“全堆”和“跟蹤”(通過右鍵單擊“堆”項的屬性)。

救。 您可以立即關閉Application Verifier。

啟動具有適當架構的WinDBG(與您的應用程序相同)。

Ctrl + E ,選擇您的可執行文件。

該程序將在第一條指令上停止,使用F5運行

您遇到該錯誤的可能性會更高。 您可能還會發現以前沒有意識到的內存訪問問題。 當您擊中其中一個時,調試器將以“驗證器停止”之一停止,您將在控制台中看到該消息,告訴您可以使用哪個命令進行進一步調查。 通常,您可以使用!heap -p -a <address>來查看有關堆的詳細信息,包括分配和釋放堆棧。

請記住,即使未啟動Application Verifier應用程序,也將啟用Application Verifier檢查。 您需要運行Application Verifier,禁用檢查,然后按“保存”以實際禁用它們。

希望這至少可以有所幫助。 在Internet上閱讀有關Application Verifier技術的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM