2014-10-24 3 views
0

У меня есть программа Qt GUI, внутри которой я мог бы нажать кнопку, чтобы загрузить/выгрузить многие виджеты док-станции. У меня есть проблема, что когда я нажимаю на кнопку, чтобы загрузить/выгрузить прикрепляемые виджеты, аварию программки с высказыванием, чтоОшибка _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse) в C++

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

Это не происходит каждый раз. (На самом деле очень редко бывает.) И когда я проверяю журнал событий Windows, он говорит, что приложение зависает с мертвой блокировкой поперечной нити. Но большинство людей в сети сказали, что _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse) означает ошибку памяти. Я просто не знаю, что происходит ...

Это очень большая программа от кого-то другого, и ошибка происходит очень редко ... Что я могу сделать, чтобы найти ошибку?

EDIT: Привет, У меня есть файл аварийного дампа, и я видел, что моя программа остановки в рабочем потоке с стека вызовов:> [email protected]() + 0x15 байт
Как могу ли я вернуться к исходному коду, который программа фактически остановила?

+0

_ «Что я мог сделать, чтобы найти ошибку?» _ - Начните с отладчика. –

+0

Я использовал отладчик по умолчанию, который поставляется с vC++ 2010, но ошибка просто не выйдет ... Все идет хорошо и заканчивается плавно. Что я могу сделать, чтобы заставить ошибку выйти? – Nyaruko

+1

Ты заставляешь это звучать как какой-то паразит. Может, люцер или хорек помогут? –

ответ

2

Это обычно означает, что вы пытаетесь получить доступ к незаконному блоку памяти внутри контейнера std.

Чтобы отладить это правильно, просто взгляните на стек в окне Call Stack, найдите стек, пока не дойдете до кода, и посмотрите, почему значение недействительно.

+0

Извините, но когда я сделал это в отладчике, все кажется абсолютно правильным? Так что я должен повторять и повторять, пока ошибка не повторится? – Nyaruko

+0

@Nyaruko В принципе да, или вы можете приложить процесс к отладчику, когда это произойдет. В Visual Studio см .: Debug -> Attach to process. Затем вы можете просто приостановить его и посмотреть, что происходит. –

+0

Спасибо за советы ... Это может занять много времени, чтобы найти эту ошибку сейчас ... – Nyaruko

1

Это трудно описать, но вкратце, вот что вы должны сделать:

Установите Application Verifier и запустить его.

Ctrl + A, выберите исполняемый файл.

Отмените выбор всех тестов в правой панели, выберите только Basic-> Heaps.

Убедитесь, что включена функция «Полная куча» и включена функция «Трассы» (свойства можно щелкнуть правой кнопкой мыши по элементу «Кучи»).

Сохранить. Вы можете закрыть Application Verifier.

Запуск WinDBG надлежащей архитектуры (так же, как ваше приложение).

Ctrl + E, выберите исполняемый файл.

Программа будет остановлена ​​на первой инструкции, запустите его с помощью F5

вероятность того, вы попали ошибка будет намного выше. Вы также можете найти проблему с доступом к памяти, о которой вы ранее не знали. Когда вы нажмете один из них, отладчик остановится с одним из «остановок верификатора», и вы увидите сообщение на консоли, сообщающее вам, какую команду вы можете использовать для дальнейшего изучения. Обычно вы сможете просмотреть подробную информацию о куче, используя !heap -p -a <address>, включая стеки распределения и освобождения.

Помните, что проверки Application Verifier включены, даже если приложение Application Verifier не запущено. Вам нужно запустить Application Verifier, отключить проверки и нажать «Сохранить», чтобы фактически отключить их.

Надеюсь, это поможет, по крайней мере, немного. Узнайте больше о методах верификации приложений в Интернете.

+0

Спасибо, я дам ей попробовать. – Nyaruko

+0

Это показывает тонны ошибок в оригинальных кодах, которые не мной ... сейчас, но все же спасибо. – Nyaruko