ole32.dll вызывает GPF. Как интерпретировать отчет DebugDiag? - PullRequest
2 голосов
/ 19 мая 2009

Мое приложение ( EasyJob ) вызывает ошибку нарушения доступа при выходе. Это происходит только в некоторых системах, в основном в Vista, но в некоторых системах XP. Приложение написано на VB6.

После нахождения системы, которая показывает такое поведение, я запустил DebugDiag в своем процессе и получил этот отчет:

Function                            Arg1        Arg2        Arg3
0x04246c81                          726c7fc8    778bf188    0012fea4
ole32!CoDisconnectObject+55         726c7fc8    00000000    00000002
msvbvm60!BASIC_CLASS_Release+10b2d  00000002    013e07cc    727ae518
msvbvm60!TipUnloadProject+df2       013e08dc    013e07cc    727ae470
msvbvm60!EbResetProjectNormal+1a54  00000000    00000000    00000000

В easyjobpro__PID__5240__Date__05_18_2009__Time_09_24_01PM__619__Second_Chance_Exception_C0000005.dmp модуль C: \ Windows \ System32 \ ole32.dll вызвало нарушение прав доступа (0xc0000005) при попытке записи в ячейку памяти 0x726c7fc8 на резьбе 0

ОК, похоже, это вызвано OLE32.dll, но как я могу это исправить ???? O :-)

Есть ли способ получить более длинную трассировку стека, чтобы я мог реально увидеть, какая часть моего кода запустила эту вещь? Кажется, это связано с тем, что какой-то класс выгружается (BASIC_CLASS_Release), но как мне узнать, какой именно?

Кто-нибудь знает, почему это может происходить в основном в Vista?

Этот материал сводит меня с ума, так что ЛЮБАЯ помощь будет СЛАВНО оценена. Серьезно, я куплю тебе пиво, где бы ты ни был. O: -)

Ответы [ 3 ]

2 голосов
/ 19 мая 2009

Я обнаружил, что в этих случаях очень часто объекты ссылаются на формы VB. Если в событии Unload для переменной Form задано значение Nothing и убедитесь, что вы вызвали Unload после использования формы или до закрытия приложения, то GPF исчезнет.

2 голосов
/ 21 мая 2009

Вы можете попробовать использовать Crashfinder Джона Роббинса, чтобы увидеть, соответствует ли шестнадцатеричный адрес (0x04246c81) какому-либо из вашего кода. Может дать вам понять, какие объекты участвуют. Создайте приложение с отладочной информацией для создания PDB. Затем снова воспроизведите ошибку с новым приложением (так как информация PDB изменит шестнадцатеричный адрес в exe).

Crashfinder.exe находится в этом самораспаковывающемся ZIP . Сделайте File-New, чтобы создать новый проект, затем Edit-Add Image, чтобы загрузить ваш exe. Затем Edit-Find Crash и введите новый шестнадцатеричный адрес. Он сообщит вам исходный файл и подпрограмму, соответствующие шестнадцатеричному адресу (если он находится в вашем собственном коде).

2 голосов
/ 19 мая 2009

GPF на выходе обычно вызывается неправильной последовательностью деинициализации. Например, могло произойти следующее: некоторый код, который освобождает все объекты, уже был вызван, и теперь у вас есть свисающий указатель, и код, выполняемый в настоящее время, пытается освободить тот же объект. Поскольку объекта больше нет, вы получаете GPF.

Такие ситуации обычно трудно отладить. То, что вам нужно, - это выделенная деинициализация, при которой вы отключаете, завершаете, очищаете, закрываете и т. Д. Все объекты, которые вы инициализировали во время работы программы. В большинстве случаев все, что вам нужно, это просто установить для pointet значение Nothing - встроенное управление ресурсами будет правильно деинициализировано. Вы должны выполнить этот код до начала завершения всей программы - где-то, как при закрытии главного окна.

...