Отстраняване на грешки Visual Basic Runtime Error 5

Имам 32-битово приложение Visual Basic 4, което води до a

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-Code и нямам шанс, освен че премина към VB6. Ако дадеш това като отговор, мога да го приема.   -  person Thomas Weller    schedule 17.04.2014


Отговори (2)


Грешката е от виртуалната машина на VB, а не от API. Не виждам как WinDbg би бил полезен на VB4, който се интерпретира и е в P-Code.

Грешка по време на изпълнение на Visual Basic 5 Показва едно от следните:

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

И в случай, че това е API повикване, VB използва LoadLibrary и GetProcAddress.

Някои контроли са загубили стойностите по подразбиране с течение на времето и това може да причини първата.

Третото може да се случи, ако съвременните технологии надхвърлят очакванията на програмата, напр. дисково пространство.

Вижте също (съжалявам, че няма връзки, те са на моя твърд диск)

Q131007 HOWTO: Използвайте Windows NT WinDbg.exe с Visual Basic (това е за NT 3.5)

Q166275 HOWTO: Отстраняване на грешки в Native Code Visual Basic Component във 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