|
VB6 Runtime error: как узнать где?
|
|||
---|---|---|---|
#18+
Доброго времени суток. Есть старый проект на VB6 с исходниками. Программой активно пользуются. Но в ней иногда вылетает Runtime error 91: Object variable or With block variable not set. Вылетает довольно редко, и повторить её (хоть в среде VB, хоть без оной) не удаётся. Можно ли как-то узнать номер строки и имя файла где ошибка, когда она всё-таки вылетела? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2016, 13:30 |
|
VB6 Runtime error: как узнать где?
|
|||
---|---|---|---|
#18+
Serg_77mМожно ли как-то узнать номер строки Да запросто. Перенумеровать строки, поправить обработчики ошибок, перекомпилять исходник и ждать вылета с диагностикой... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2016, 14:09 |
|
VB6 Runtime error: как узнать где?
|
|||
---|---|---|---|
#18+
Для начала нужно сузить область поиска, опросив пользователей на предмет их действий, при которых возникает ошибка. Потом навставлять обработчиков ошибок в те процедуры, где их нет. Когда процедура определена, можно пронумеровать ее строки и воспользоваться функцией Erl, которая возвращает номер строки, в которой возникла ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2016, 14:10 |
|
VB6 Runtime error: как узнать где?
|
|||
---|---|---|---|
#18+
Про такие способы читал раньше. Хотел узнать, можно ли это сделать, не покорёжив основательно проект. Оказывается, можно. Помогла публикация . Теоретически можно даже удалённо. Нужен отладчик 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.
6. Видим примерно это: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Правда, это не сама точка вылета, а строка в процедуре верхнего уровня, в которой не оказалось обработчика ошибки. Весь стек вызовов к моменту появления MsgBox уже разрушен. Можно узнать и точку вылета (в статье по ссылке выше написано как), но для этого надо изначально запустить программу из отладчика, и как-то обойти уйму ложных срабатываний исключений, для которых обработчик в программе есть. Всё же лучше чем ничего. А нумеровать строки и вставлять уйму обработчиков очень уж тяжко. И легко можно что-нибудь сломать, не во всякую процедуру можно вставлять обработчик, блоки try/catch (то есть on error/err.raise) там используются. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2016, 19:18 |
|
|
start [/forum/topic.php?fid=60&fpage=20&tid=2155458]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
others: | 307ms |
total: | 474ms |
0 / 0 |