繁体   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