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

Тема в разделе "MS Visual C++", создана пользователем DbIMKA, 31 окт 2008.

  1. DbIMKA

    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

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Все нижеследующее - для VC6, но думаю что мап файл не пропал.
    ключевая цифра - at address 04FAFFC7.
    Вариант 1: Нам понадобиться .map файл в Release каталоге, если его нет, надо включить в опциях и пересобрать. При этом адреса могут сдвинуться. Ну и само собой разумеется, мы считаем что у тебя версия идентичная пользовательской. Открываешь .map файл - в нем (после всяких заголовков) перечислены все функции твоего бинарника, с базовыми адресами, например:
    Код (Text):
     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, либо благодаря прокаченному скиллу "Чтение асм листинга" пытаешься найти что это за функция. Находишь, дальше уже мелочь - проанализировть все вызовы и поискать причину.

    Примерно так.
     
Загрузка...

Поделиться этой страницей