powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6 Runtime error: как узнать где?
4 сообщений из 4, страница 1 из 1
VB6 Runtime error: как узнать где?
    #39293268
Serg_77m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Есть старый проект на VB6 с исходниками. Программой активно пользуются. Но в ней иногда вылетает Runtime error 91: Object variable or With block variable not set. Вылетает довольно редко, и повторить её (хоть в среде VB, хоть без оной) не удаётся. Можно ли как-то узнать номер строки и имя файла где ошибка, когда она всё-таки вылетела?
...
Рейтинг: 0 / 0
VB6 Runtime error: как узнать где?
    #39293298
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_77mМожно ли как-то узнать номер строки
Да запросто. Перенумеровать строки, поправить обработчики ошибок, перекомпилять исходник и ждать вылета с диагностикой...
...
Рейтинг: 0 / 0
VB6 Runtime error: как узнать где?
    #39293301
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала нужно сузить область поиска, опросив пользователей на предмет их действий, при которых возникает ошибка.
Потом навставлять обработчиков ошибок в те процедуры, где их нет.
Когда процедура определена, можно пронумеровать ее строки и воспользоваться функцией Erl, которая возвращает номер строки, в которой возникла ошибка.
...
Рейтинг: 0 / 0
VB6 Runtime error: как узнать где?
    #39293517
Serg_77m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про такие способы читал раньше. Хотел узнать, можно ли это сделать, не покорёжив основательно проект. Оказывается, можно. Помогла публикация . Теоретически можно даже удалённо.
Нужен отладчик WinDbg, программа должна быть скомпилирована с Symbolic Debug Info, актуальный файл .pdb лежит рядом с .exe. Программа запущена, ошибка вылетела, на экране - MsgBox с Runtime Error. Далее по шагам:
1. Запускаем WinDbg, выбираем в меню File->Attach to a Process, в открывшемся списке находим нужный процесс, OK.
2. Переключаемся на нулевой поток через меню View->Processes and Threads (первый в списке) или командой: ~0s
3. Раскрываем стек вызовов через меню View->Call Stack (нажав потом кнопку Addrs) или командой: k
4. Находим в списке (в районе 15-й строки сверху) примерно это. Интересующая строка помечена стрелкой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
0:000> k
        ChildEBP RetAddr  
        WARNING: Stack unwind information not available. Following frames may be wrong.
        0018ea80 75afcf6c USER32!WaitMessage+0x15
        ...
        0018f324 72a10dcf ntdll!KiUserExceptionDispatcher+0xf
        0018f344 72a0e228 MSVBVM60!EbGetHandleOfExecutingProject+0x22b3
--->    0018f358 72a0e28c MSVBVM60!rtcDoEvents+0x131
        0018f368 72a219ee MSVBVM60!rtcDoEvents+0x195
        0018f4b4 778e391d MSVBVM60!_vbaUI1I2+0x12
        ...
5. Вводим команду (адрес подставляется из помеченной строки): dps 0018f358
6. Видим примерно это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
0:000> dps 0018f358
        0018f358  000003e8
        0018f35c  72a0e28c MSVBVM60!rtcDoEvents+0x195
        0018f360  004edb68
        0018f364  0018f3b4
        0018f368  0018f484
        0018f36c  72a219ee MSVBVM60!_vbaUI1I2+0x12
        0018f370  00000006
        0018f374  00000001
--->    0018f378  00401b6a sample1!Form1::Text1_Change+0x4a [Form1.frm @ 45]
        0018f37c  0018f3b4
        0018f380  0018f484
        0018f384  00000001
        0018f388  75ad6ce9 USER32!GetThreadDesktop+0x86
        0018f38c  75ad6d91 USER32!GetThreadDesktop+0x12e
        0018f390  778e3d17 ntdll!RtlQueryPerformanceCounter+0xa83
В отмеченной строке - имя процедуры, в квадратных скобках - файл и номер строки. Номер строки, если смотреть этот файл в блокноте, а не в среде VB. И номер строки не инструкции с ошибкой, а следующей за ней.
Правда, это не сама точка вылета, а строка в процедуре верхнего уровня, в которой не оказалось обработчика ошибки. Весь стек вызовов к моменту появления MsgBox уже разрушен. Можно узнать и точку вылета (в статье по ссылке выше написано как), но для этого надо изначально запустить программу из отладчика, и как-то обойти уйму ложных срабатываний исключений, для которых обработчик в программе есть. Всё же лучше чем ничего.

А нумеровать строки и вставлять уйму обработчиков очень уж тяжко. И легко можно что-нибудь сломать, не во всякую процедуру можно вставлять обработчик, блоки try/catch (то есть on error/err.raise) там используются.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6 Runtime error: как узнать где?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]