Сообщений 5    Оценка 90        Оценить  
Система Orphus

Использование отладочных символов Windows в VC++ 7.x

Автор: Илья Зарецкий
The RSDN Group

Источник: RSDN Magazine #3-2005
Опубликовано: 14.09.2005
Исправлено: 10.12.2016
Версия текста: 1.0

Даже если вы не занимаетесь разработкой драйверов, а возможностей встроенноего отладчика Visual Studio вполне хватает для ваших нужд при поиске ошибок в „обычных“ приложениях, одна утилита из комплекта Debugging Tools for Windows способна изрядно облегчить ваш труд — речь идет о так называемом „синхронизаторе символов“ (symchk.exe).

Как известно, Microsoft предоставляет для свободного доступа отладочную информацию (в виде .pdb-файлов), полученную при сборке системных исполняемых модулей. Эта информация позволяет видеть более „дружественную“ трассировку стека вызовов при выполнении вашего приложения под отладчиком; кроме того, при базовых знаниях ассемблера x86 вы получаете возможность с определенным комфортом прогуляться по внутренностям системных функций в поисках причины возникновения той или иной ошибки.

Однако есть два обстоятельства, несколько омрачающих данную перспективу. Первое из них состоит в том, что „дистрибутив“ отладочной информации, который предлагается скачивать с сайта Microsoft, имеет весьма существенный объем — например, для Windows XP SP2 он составляет около 200 мегабайт. Второе обстоятельство еще более печально: начаная с некоторого времени, в Microsoft перестали включать соответствующие .pdb-файлы в состав обновлений Windows, выпускаемых в промежутках между сервис-паками. Соответственно, после установки очередной „заплатки“ отладчик может оказаться не в состоянии предоставить вам корректную трассировку стека.

Ниже я хочу предложить вам способ решения перечисленных проблем, основанный на личном опыте и показавшийся мне наиболее „дешевым“ и рациональным; надеюсь, что эти рекомендации окажутся кому-нибудь полезны.

Итак, пусть у нас имеется регулярно обновляемая английская Windows XP Pro SP2 и Visual C++ 7.x (проверял на версии 7.0.9955 — то есть, 7.0 SP1). Последовательность действий, позволяющих получить необходимые отладочные символы и поддерживать их в актуальном состоянии по мере установки очередных „заплаток“, выглядит следующим образом:

1. Заходим на страницу Debugging Tools for Windows, скачиваем оттуда нужный дистрибутив (рармер текущей версии для x86 составляет около 13 мегабайт) и устанавливаем его.

2. Создаем папку (у меня это %SystemDrive%\NTSymbolsCache), в которую утилита symchk.exe будет закачивать .pdb-файлы.

3. В папке, созданной на шаге 2, создаем обычный текстовый файл, содержащий полные имена системных исполняемых модулей, отладочные символы для которых требуются нам в процессе разработки/отладки; имя каждого файла должно находиться на отдельной строке. Составить этот список „требуемых“ модулей довольно просто — достаточно запустить приложение под отладчиком и в окне „Output“ обратить внимание на строки вида „'имя_приложения.exe': Loaded 'диск:\путь\имя_файла.dll'...“ У меня после запуска пары-тройки приложений получился файл, который я назвал SysDLLs.txt, следующего содержания:

K:\WINDOWS\system32\advapi32.dll
K:\WINDOWS\system32\comctl32.dll
K:\WINDOWS\system32\comdlg32.dll
K:\WINDOWS\system32\crypt32.dll
K:\WINDOWS\system32\gdi32.dll
K:\WINDOWS\system32\kernel32.dll
K:\WINDOWS\system32\MicrosoftWindowsCommon-Controls-6.0.2600.2527-comctl32.dll
K:\WINDOWS\system32\msasn1.dll
K:\WINDOWS\system32\msimg32.dll
K:\WINDOWS\system32\msvcrt.dll
K:\WINDOWS\system32\ntdll.dll
K:\WINDOWS\system32\odbc32.dll
K:\WINDOWS\system32\ODBCCP32.dll
K:\WINDOWS\system32\ole32.dll
K:\WINDOWS\system32\oleaut32.dll
K:\WINDOWS\system32\rpcrt4.dll
K:\WINDOWS\system32\secur32.dll
K:\WINDOWS\system32\shdocvw.dll
K:\WINDOWS\system32\shell32.dll
K:\WINDOWS\system32\shlwapi.dll
K:\WINDOWS\system32\urlmon.dll
K:\WINDOWS\system32\user32.dll
K:\WINDOWS\system32\userenv.dll
K:\WINDOWS\system32\uxtheme.dll
K:\WINDOWS\system32\version.dll
K:\WINDOWS\system32\winhttp.dll
K:\WINDOWS\system32\wininet.dll
K:\WINDOWS\system32\winmm.dll
K:\WINDOWS\system32\winspool.drv
K:\WINDOWS\system32\ws2_32.dll
K:\WINDOWS\system32\ws2help.dll
K:\WINDOWS\system32\wsock32.dll

4. Дабы окончательно сберечь пальцы и клавиатуру, создаем все в той же папке NTSymbolsCache простенький „скрипт“ (я назвал его symchk.cmd) следующего содержания:

@echo off
symchk.exe /it K:\NTSymbolsCache\SysDLLs.txt /s SRV*K:\NTSymbolsCache\*http://msdl.microsoft.com/download/symbols /oi /op /ov

5. В командной строке переходим в папку, куда были установлены Debugging Tools for Windows („замусоривать“ переменную окружения PATH в данном случае не стоит), и запускаем на выполнение файлик, созданный на шаге 4, любуясь появляющимися в консоли строками:

K:\Debugging Tools for Windows>K:\NTSymbolsCache\symchk.cmd
SYMCHK: advapi32.dll [5.1.2600.2180] PASSED - PDB: advapi32.pdb DBG: <N/A>
SYMCHK: comctl32.dll [5.82.2900.2527] PASSED - PDB: comctl32.pdb DBG: <N/A>
SYMCHK: comdlg32.dll [6.0.2900.2180] PASSED - PDB: comdlg32.pdb DBG: <N/A>
SYMCHK: crypt32.dll [5.131.2600.2180] PASSED - PDB: crypt32.pdb DBG: <N/A>
...
SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 31

6. Содержимое папки NTSymbolsCache теперь имеет вот такой вид:

advapi32.pdb\455D6C5F184D45BBB5C5F30F829751142\advapi32.pdb
comctl32.pdb\56DD79C0C5864165AC725B8177E8CB332\comctl32.pdb
comdlg32.pdb\4FCBEAD63D7345998C1F92D8DBB0DC272\comdlg32.pdb
...
(„магические числа“, как я понимаю, связывают .pdb-файл с соответствующей версией DLL-библиотеки).

7. Создаем папку, из которой отладчик будет загружать файлы с отладочными символами (у меня это традиционная %SystemRoot%\Symbols), копируем туда .pdb-файлы (без всяких вложенных папок, в „корень“) и заводим системную переменную окружения _NT_SYMBOL_PATH, значением которой является полное имя папки, куда мы только что скопировали .pdb-файлы. Перезапускаем Visual Studio, если она была запущена при выполнении всех этих действий — и наслаждаемся полноценной трассировкой стека.

8. По мере установки на Windows новых обновлений выполняем п.5 (symchk.exe будет закачивать только те файлы, которые соответствуют обновившимся или добавившимся DLL-библиотекам из списка) и „освежаем“ папку, на которую указывает _NT_SYMBOL_PATH.

Ссылки по теме:


Эта статья опубликована в журнале RSDN Magazine #3-2005. Информацию о журнале можно найти здесь
    Сообщений 5    Оценка 90        Оценить