app.exe вызвал точку останова с указанием места записи о нарушении прав доступа - PullRequest
1 голос
/ 08 марта 2012

У меня есть приложение Qt c ++ с огромной кодовой базой.Я немного знаком с архитектурой, но я не знаю много кода.Каждый раз, когда приложение закрывается, оно показывает сообщение «app.exe вызвало точку останова», и если я нажимаю продолжить, я получаю

«Необработанное исключение в 0x6701c95d (QtCored4.dll) в приложении.exe: 0xC0000005: Место записи нарушения прав доступа 0x0c3e9fd8. "

с трассировкой стека, похожей на эту

enter image description here

У меня подключен App Verifier ион выводит это в окно вывода

===========================================================
VERIFIER STOP 0000000000000013: pid 0x2654: first chance access violation for current stack trace 

    000000000C3E9FD8 : Invalid address being accessed
    000000006701C95D : Code performing invalid access
    000000000008EB40 : Exception record. Use .exr to display it.
    000000000008E650 : Context record. Use .cxr to display it.
===========================================================
This verifier stop is continuable. 
After debugging it use `go' to continue.
===========================================================

Мой вопрос: как можно попытаться отладить, чтобы выяснить, что является причиной этой проблемы?У меня нет большого опыта в мире неуправляемого программирования, и я полностью потерян.Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

Скорее всего, у вас возникли повреждения памяти, вызванные переполнением буфера или двойным удалением висящего указателя.Такого рода вещи могут происходить при вызове кода Qt, если вы не понимаете, что родитель QObject становится его владельцем, как отмечает Барт.Вы уже используете App Verifier, но я бы также попытался запустить gflags из Средства отладки для Windows и включить Отладка кучи страниц , поскольку это может помочь локализовать проблему.

1 голос
/ 08 марта 2012

У вас подключен отладчик, и он показывает стек вызовов, вы должны иметь возможность проверять значения переменных по мере подъема по стеку и видеть, находится ли какая-либо из ваших переменных в правильном состоянии.

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

У вас есть исходный код?Если так, то это должно быть относительно просто, так как похоже, что у вас есть полные pdbs для QT, поскольку он показывает правильно разрешенные символы и номера строк.

Вы также можете попробовать WinDbg, но это очень продвинутый отладчик, который будетТебе понадобится время на изучение.

Я думаю, тот факт, что у тебя уже есть отладчик, и он уже показывает тебе столько полезной информации, что ты должен посмотреть в окно памяти / locals / autos и проверить значения переменных,вполне вероятно, что один из этих указателей будет нулевым или неинициализированным.

Глядя на стек вызовов, я посмотрел бы на объект QCursor, и если ваш сеанс отладки активен, то наведение курсора на объект, вероятно, даст некоторыевсплывающее окно, в котором будет отображаться его текущее значение, вероятно, это значение или адрес является нулевым или недействительным.

...