Сообщений 5 Оценка 90 Оценить |
Даже если вы не занимаетесь разработкой драйверов, а возможностей встроенноего отладчика 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 |
4. Дабы окончательно сберечь пальцы и клавиатуру, создаем все в той же папке NTSymbolsCache простенький „скрипт“ (я назвал его symchk.cmd) следующего содержания:
@echo off |
5. В командной строке переходим в папку, куда были установлены Debugging Tools for Windows („замусоривать“ переменную окружения PATH в данном случае не стоит), и запускаем на выполнение файлик, созданный на шаге 4, любуясь появляющимися в консоли строками:
K:\Debugging Tools for Windows>K:\NTSymbolsCache\symchk.cmd |
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.
Ссылки по теме:
Сообщений 5 Оценка 90 Оценить |