как найти причину вылетания проги в Release Build у клиента по этим да

  • Автор темы DbIMKA
  • Дата начала
D

DbIMKA

Здравствуйте, уважаемые!

Моя прога вылетает у нескольких клиентов, я не могу вопроизвести баг. Вот, что мне прислали - как правильно найти место в исходнике, которое вызывает ошибку по этим данным? Выслать им debug build или другую версию "попробовать" я не могу, нужно понять, что происходит из этого сообщения и починить. Visual C++ 2005.. Подскажите пожалуйста, как подходить к идентификации проблемы по этим данным? Спасибо!

Exception: Access Violation (code 0xc0000005) at address 04FAFFC7 in thread C80
Module: Exception: Access Violation (code 0xc0000005) at address 04FAFFC7 in thread C80

Logical Address: 52C234:00000000

00B01F24 04FAFFC7 0000:00000000 x.
Params: 10003F10 00000000 00000000 00000000

00B02170 00B02198 0000:00000000 x.
Params: 00000000 00000000 00000000 00000000

0017FA78 FFFFFFFF 0000:00000000 x.
Params: 0017FAA8 0017F5F0 00000000 00000000


EAX:00B0D7F7 EBX:00000000 ECX:04FB9E28 EDX:18DBA590 ESI:00B0D7F8 EDI:00B01F18
EIP:04FAFFC7 ESP:0132FF18 EBP:00B01F24
CS:001B SS:0023 DS:0023 ES:0023 FS:003B GS:0000
Flags:00010282

Windows Ver: NT 5.1 Service Pack 3 Build 2600
DDraw Ver:
DSound Ver:

Time Loaded: 00:00:56
Fullscreen: Yes
Primary ThreadId: A50

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

grigsoft

Все нижеследующее - для VC6, но думаю что мап файл не пропал.
ключевая цифра - at address 04FAFFC7.
Вариант 1: Нам понадобиться .map файл в Release каталоге, если его нет, надо включить в опциях и пересобрать. При этом адреса могут сдвинуться. Ну и само собой разумеется, мы считаем что у тебя версия идентичная пользовательской. Открываешь .map файл - в нем (после всяких заголовков) перечислены все функции твоего бинарника, с базовыми адресами, например:
Код:
 0001:00005540	  ??0CRegExpCombo@@QAE@XZ	00406540 f  dredit.obj
0001:00005570	  ??_GCRegExpCombo@@UAEPAXI@Z 00406570 f i dredit.obj
0001:00005570	  ??_ECRegExpCombo@@UAEPAXI@Z 00406570 f i dredit.obj
0001:00005590	  ??1CRegExpCombo@@UAE@XZ	00406590 f  dredit.obj
На цифру в середине строки и надо равняться - ищешь последнюю функцию, адрес которой будет меньше адреса ошибки. В этой функции и есть ошибка. По относительному смещению можно судить о месте в функции. Если нашел - тебе (очень) повезло. Если нет, можно попробовать поискать так адреса 00B01F24, 00B02170. Если и это не помогло, значит вылет где-то в системной функции, которую ты дернул не с тем параметром. Тогда остается способ 2.

Вариант 2: Запускаться следует на версии винды аналогичной пользовательской. Запускаешь под отладкой release версию, останавливаешь (break), открываешь CodeView, или как оно там будет называться, с асм листингом. переходишь по адресу 04FAFFC7, ставишь там точку останова. Продолжаешь выполнение. Когда там остановишься, смотришь стек - если вылет действительно не у тебя, то отматываешь стек до твоего приложения, дальше смотришь адрес вызова, и либо через метод 1, либо благодаря прокаченному скиллу "Чтение асм листинга" пытаешься найти что это за функция. Находишь, дальше уже мелочь - проанализировть все вызовы и поискать причину.

Примерно так.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!