Re[5]: Восстановка PDB файлов.
От: szag  
Дата: 09.08.10 13:31
Оценка: 13 (4)
Здравствуйте, uzhas, Вы писали:

U>Здравствуйте, szag, Вы писали:


S>>Стэк показывает Dump файл, точнее адреса функций в стэке. По мапу находите сами названия функций и смещение в конкретной функции. Ну а дальше по .cod файлам находите строчку крэша. Итого есть стэк, функция в которой упало и строчка в которой упала. + В дамп файле есть тип ошибки. ИМХО, этого достаточно.


U>а подробнее вы можете пояснить способ анализа дампа?

U>какими тулзами следует пользоваться?
U>как дамп файл "показывает" стэк?
U>как по мапу найти название функции?
U>я надеюсь, это не вручную делается?

Есть разные тулзы для этого. Watson dump viewer или WinDBG например.
Общая схема такова:
1. открываете дамп файл и смотрите информацию о процессе в котором произошла ошибка
что-то типа вот этого там должны увидеть:

Flags: 0x0008
Owner Process: 0x054B0006 ( yourprocess.EXE)
Current Process: 0x054B0006 ( yourprocess.EXE)
Thread: 0x054C0006 ( yourprocess!4003C188 )
API Owner Process: 0x00000000
API Current Process: 0x00000000
API Thread: 0x00000000
Exception Code: 0xC0000005
Exception Flags: 0x00000001
Address of Exception Record: 0x00000000
Exception Address: 0x0053CF4C
Exception Parameters:

2. Дальше открываем информацию о потоках этого процесса и ищем поток с InfoStatus == 0
3. Смотрим стэк этого потока, будет что-то вроде:

Function ReturnAddr FramePtr ProcessId Flags Params0 Params1 Params2 Params3
yourprocess!0053CF4C() 0053CF4C 00ACB2B4 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00063A9C() 00063A9C 00ACB2B8 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00183A00() 00183A00 00ACB2C0 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00543088() 00543088 00ACC260 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!003F7F5C() 003F7F5C 00ACC2B0 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00541648() 00541648 00ACC2EC 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!0038AAB8() 0038AAB8 00ACC314 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!0038AB98() 0038AB98 00ACC328 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!0051E9A8() 0051E9A8 00ACC334 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00177CB8() 00177CB8 00ACC368 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00348624() 00348624 00ACFDB0 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!00348690() 00348690 00ACFDD0 054B0006 00000000 00000000 00000000 054C0007 00000001
yourprocess!4003C188() 4003C188 00ACFDE4 054B0006 00000000 00000000 00000000 054C0007 00000001

4. Это и есть стэк. Вас интересует ReturnAddr здесь.
5. Есть такой бесплатный тул называется Exception Wizard. Работает он так, вы ему даете мап файл и указываете смещение, а он вам показывет имя функции. Итого, по адресам выше легко восстанавливается стэк.
6. Так же этот тул показывает Function offset в виде 0x74. Открываете соответствующий .cod файл и ищите эту функцию точно в том виде как дал Вам её Exception Wizard. Находите функцию и там будут идти смещения на каждую строку, по смещению находите строчку крэша.

Это если вкратце. А так тут конечно много нюансов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.