Отладка Visual Basic Runtime Error 5

У меня есть 32-битное приложение Visual Basic 4, которое приводит к

Run-time error '5':
Invalid procedure call

Я запускаю WinDbg и делаю

sxe *

разбить на все исключения. Однако он отображает сообщение без предварительного взлома отладчика.

Если я сломаюсь во время сообщения, стек вызовов не очень полезен. Есть ли способ взломать приложения Visual Basic 4 в момент возникновения проблемы?

Часто задаваемые вопросы о проблеме:

  • Можете ли вы запустить его в среде IDE?
    Да, я могу и, вероятно, смогу исправить ошибку, когда сделаю это. Однако я хотел бы получить дополнительную информацию в то время, когда конечный пользователь запускает приложение, чтобы мне не нужно было воспроизводить его.

  • Что вы хотите сделать, если найдете причину ошибки?
    Ну, это зависит от типа ошибки. Может быть, я могу исправить это, может быть, я не могу. Обычно я получаю очень полезную информацию от WinDbg.

  • Когда возникает ошибка?
    Она повторяется, когда пользователь нажимает кнопку закрытия в форме.

  • Что делает приложение?
    О, это хороший вопрос. Я точно не знаю. Он использует связь RS232, но пока не задействован.

  • Знаете ли вы что-нибудь о данных, которые может вводить пользователь?
    Я почти ничего об этом не знаю. В данном конкретном случае нет необходимости вводить данные.


person Thomas Weller    schedule 17.04.2014    source источник
comment
можно запустить в IDE? Если нет, что вы хотите сделать, если выясните причину ошибки? Ошибка возникает всегда или иногда все нормально? Когда возникает ошибка, когда программа запускается, когда выполняется определенное действие, когда вы ее закрываете, ...? ... Что делает приложение, работает ли оно с файлами/системными файлами/реестром, использует ли оно последовательное (rs232) соединение, использует ли оно соединение Ethernet? Знаете ли вы что-нибудь о данных, которые может вводить пользователь?   -  person Hrqls    schedule 17.04.2014
comment
Я не понимаю, как может быть полезен windbg на vb4, который интерпретируется и находится в p-коде. Почему вы не используете отладчик VB4. Есть символы времени выполнения, и vb6 может создавать файлы символов приложения, возможно, vb4 тоже. Invb6 переменная среды указывает VB6 поместить символы в приложение, link=/pdb:none, но вам все равно нужно включить символы. Ошибка связана с виртуальной машиной VB, а не с API.   -  person tony bd    schedule 17.04.2014
comment
@Hrqls: я обновил вопрос.   -  person Thomas Weller    schedule 17.04.2014
comment
Это 16- или 32-битное приложение VB4. Похоже, что для виртуальной машины нет символов.   -  person tony bd    schedule 17.04.2014
comment
@tonybd: 32-битный. Я согласен, что это, вероятно, дело в P-коде, и у меня нет шансов, кроме как перейти на VB6. Если вы дадите это как ответ, я могу принять это.   -  person Thomas Weller    schedule 17.04.2014


Ответы (2)


Ошибка связана с виртуальной машиной VB, а не с API. Я не понимаю, как WinDbg будет полезен на VB4, который интерпретируется и находится в P-коде.

Ошибка времени выполнения Visual Basic 5 Указывает на одно из следующего:

  • Введено недопустимое имя коллекции или свойства.
  • Выходной параметр был NULL.
  • Значение не является одним из поддерживаемых значений или выходит за пределы поддерживаемого диапазона.
  • Свойство доступно только для чтения.
  • Свойство нельзя изменить после создания объекта.
  • Введен неверный индекс.

И в случае, если это вызов API, VB использует LoadLibrary и GetProcAddress.

Некоторые элементы управления со временем потеряли значения по умолчанию, и это может привести к первому.

Третье может произойти, если современные технологии превзойдут ожидания программы, например. дисковое пространство.

Также см. (извините, ссылок нет, они у меня на жестком диске)

Q131007 HOWTO: Использование Windows NT WinDbg.exe с Visual Basic (для NT 3.5)

Q166275 HOWTO: Отладка компонента Visual Basic собственного кода в VC++ (рассказывает о том, что вы можете увидеть в VB в отладчик)

VB4 не может создавать символы

person tony bd    schedule 17.04.2014
comment
PS: Билл Гейтс и Пол Аллен придумали это сообщение об ошибке 39 лет назад. blogs.msdn.com/b/ericlippert/archive/ 2004/09/09/227461.aspx - person tony bd; 17.04.2014

Поскольку ошибка возникает, когда пользователи нажимают кнопку закрытия, я предполагаю, что работает (очень плотный) цикл, который не получает ожидаемые данные (вероятно, нулевая строка)

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

Что вам нужно сделать, так это выйти из этого цикла и закрыть соединение с устройством RS232 перед закрытием формы. Возможно, вы сможете сделать это в событии Form_Unload(), но это также может произойти и до этого, поэтому вам, возможно, придется сделать это в коде кнопки закрытия... убедитесь, что пользователь выиграл. не используйте X, чтобы закрыть форму, хотя

Лично я бы запускал программу из среды IDE, это укажет вам непосредственно на ошибочную часть кода и даст вам возможность просмотреть содержимое задействованных переменных и контролировать состояния... это намного быстрее, чем делать предположения по данным WinDbg

person Hrqls    schedule 17.04.2014