microsoft windows debugging symbols что это за программа и можно ли ее удалить
Отладочные символы
В дополнение ко всему прочему, изрядные проблемы при освоении логики продолжает создавать оптимизация кода, которую выполняют компилятор и компоновщик, окончательно запутывая и раздувая код. Единственное, что могли делать в свое время реверсивные инженеры, это создавать в дизассемблированном листинге собственные комментарии, пытаясь этот самый листинг документировать, тем самым хоть как-то «оживив» исходный код. Вероятно, на каком-то из этапов решено было упростить столь нелегкий процесс отладки программного обеспечения и некоторые вендоры операционных систем начали предоставлять специальные файлы, называемые отладочными символами, для системных файлов своих операционных систем и различных продуктов. Не стала исключением и корпорация Microsoft, поэтому данное нововведение заметно упростило процесс отладки закрытого кода Windows.
Символы абсолютно не применимы в ходе штатного выполнения программы, но крайне полезны в процессе её отладки. Люди, которые не по наслышке знакомы с программированием, могут подтвердить, что компилятор, конвертируя исходный код программы в машинный код, выбрасывает имена функций. Другими словами, в получившемся исполняемом модуле Вы не увидите никаких имен. Единственный вариант получить связь между адресами и именами, это сгенерировать файл отладочных символов. Однако отладочные символы, в большинстве случаев, по умолчанию не генерируются, а могут быть созданы лишь при указании дополнительных опций компиляции.
Если пояснить данное понятие простым языком, то отладочные символы требуются (что очевидно по названию), для удобства отладки кода, а именно с целью понять что есть что в структуре изучаемого приложения. В общем случае, в файле отладочных символов хранятся:
При наличии этой информации отладчик по адресу памяти легко находит соответствующую функцию по ближайшему предыдущему адресу. Да и исследователю эта информация позволяет видеть «символические» данные об исследуемом двоичном файле, что в свою очередь в значительной мере упрощает исследование алгоритма приложения в процессе статического дизассемблирования либо интерактивной отладки. Исследователю кода гораздо удобнее просматривать значения переменных, а не безликих ячеек памяти. Отладочные символы часто используются в процессе поиска ошибок в исходном коде, отладке программы и разного рода отказах. По методу размещения отладочная информация может:
Это имеет под собой достаточно простую подоплеку, ведь отладочные символы жестко привязаны к конкретному исходному коду, и если в исходном коде что-либо меняется (строка, процедура, переменная), то старое соответствие перестает быть актуальным и требуется сгенерировать новый файл символов, который в точности соответствует уже новому, измененному исходному коду. С точки зрения разработчика стоит учесть и тот факт, что потенциально любое изменение проекта вызывает полную несовместимость между файлов символов и компонентом, поэтому файлы символов и бинарные файлы нужно строить одновременно. С точки зрения исследователя необходимо помнить, что файлы отладочных символов меняются при каждой новой сборке (build), поэтому процесс обновления системы требует также и обновления файлов отладочных символов, относящихся к системным модулям. Вот почему достаточно удобно использовать автоматизированный процесс запроса символов, дабы не отвлекаться на ручную синхронизацию.
Нужны ли символы
Отладчик WinDbg корпорации Microsoft можно сконфигурировать на автоматический запрос отладочной информации, если в ней есть необходимость. Вот как раз основной вопрос, на который я хотел сам себе ответить, нужны ли эти самые отладочные символы или нет? Я провел простейший эксперимент, который состоял в том, что я нашел завалявшийся у меня на тестовой станции дамп падения в синий экран (BSOD) и подключил его сначала в WinDbg с доступными символами, а затем в том же WinDbg без символов, и вот результат:
Честно говоря, результат меня удивил. На момент ошибки мы имеем довольно скудную информацию о сбое, такую как адрес возникновения ошибки и стек вызовов момента падения. Отладчик пытается выполнить автоматический разбор стека, и что же получается, мало того, что отладчик при отсутствии отладочных символов не может сопоставить имена и параметры функций, так он еще и не может правильно выполнить трассировку стека вызовов момента падения. Выходит, что без символов становится практически невозможно (в некоторых случаях) проследить последовательность вызовов функций, и в дополнение осложняется понимание того, какой именно модуль вызвал ошибку. Именно так! Всё только что сказанное актуально для ситуации с 32-битным кодом, поскольку:
Я думаю, тут можно особо ничего не комментировать, поскольку практически все могли заметить, что листинг справа намного более «читабелен», без дополнительных проверок кода можно визуально без труда определить, какие именно функции используются в том или ином месте исходного кода. В итоге, становится очевидным, что:
Распространение
Понятное дело, что если возникло желание символы официально предоставлять, то их необходимо каким-то образом распространять, для того, что бы конечные потребители программного продукта имели возможность (при остром на то желании конечно же) этот самый продукт отлаживать, то есть в случае возникновения ошибок иметь возможность быстро находить вероятную причину возникновения. Каким же образом отладочные символы предоставляют своей целевой аудитории? До некоторых пор разработчики, перед которыми стояла задача предоставления отладочных символов своим клиентам, передавали подобную информацию для своих продуктов на оптических носителях, дисках CD/DVD. Исключением не стала и операционная система Windows, которая может поставляться с отладочными символами, традиционно размещаемыми на дополнительном диске дистрибутива, либо в составе Driver Development Kit ( DDK ). Однако, с определенного времени популярным стал метод распространения символов через сеть Интернет. В сети для этой цели Microsoft размещает собственные сервера символов, которые и предоставляют отладочные символы, однако, чтобы работать с сервером символов, необходимо использовать специализированный протокол обмена.
Публичные и приватные (частные) символы
Публичные символы, так же, не включают информацию для помощи по отображению параметров большинства функций, информацию по локальным переменным, типам локальных переменных. Тем не менее, они содержат достаточно информации для ключевых отладочных сценариев, что зачастую является достаточным. Таким образом, можно сделать утешительный вывод:
Символьные файлы, распространяемые корпорацией Microsoft (посредством серверов символов), включают в себя исключительно публичные функции, глобальные переменные и их типы данных, то есть являются публичными. В противоположность этому, некоторые разработчики программного обеспечения (Mozilla) распространяют полную отладочную информацию (публичные символы и приватные символы). Приватные (полные, закрытые) символы (private symbols) содержат значительно больше информации, включающей в себя путь и номера строк исходного кода, имена и типы параметров функций и переменных, и если сравнивать приватные и публичные символы с точки зрения процесса отладки, то последние делают его слегка сложнее, тем не менее достаточны для большинства сценариев отладки.
Сервер символов Microsoft
Многие компоненты, разрабатываемые корпорацией Microsoft, такие как файлы, входящие в состав операционных систем, офисных приложений и прочих продуктов, компилируются вместе с символами, которые затем распространяются через сервер символов Microsoft (Microsoft Symbol Server). Сервер символов представляет собой онлайновый репозиторий публичных символов для продуктов Microsoft, который доступен для запроса посредством протокола HTTP по визуально-неотображаемому пути (URL):
Формат PDB
Со времени того, как отладочные символы стали массово востребованы сообществом специалистов, многие разработчики программного обеспечения озаботились созданием разнообразных методов хранения информации об исходных файлах в модулях символов. В связи с чем, в природе появились всевозможные форматы записи символов. Нас же, в контексте данной статьи, интересуют форматы хранения символов для продуктов Microsoft.
В общем случае, символы могут быть предоставлены в следующих форматах:
Однако мы будем рассматривать в данной статье лишь формат PDB, который является самым современным, соответственно и предпочтительным форматом для различных средств разработки от Microsoft.
Все данные, которые PDB файл может содержать:
PDB файл служит для:
Выводы
Удалите эти файлы и папки Windows, чтобы освободить место на диске
Windows содержит множество файлов и папок, которые вам не нужны.
Давайте рассмотрим некоторые файлы и папки Windows, которые можно безопасно удалить, чтобы освободить место на диске, и узнать, почему вы можете стереть их. Обратите внимание, что некоторые из этих папок находятся в защищенных местах, поэтому будьте осторожны при их удалении.
Лучший способ очистки папок Windows: очистка диска
Прежде чем мы рассмотрим несколько файлов и папок Windows, которые вы можете безопасно удалить, вы должны знать, что удаление их вручную — не лучший способ сделать это.
Помимо того, что вы можете тратить время на это самостоятельно, когда вы можете автоматизировать процесс, безопаснее позволить инструменту очистки диска выполнить эту очистку за вас. Это позволяет избежать случайного удаления файлов, которые вам нужны, или работы с неправильными папками.
Средство очистки диска Windows помогает вам освободить дисковое пространство на вашем компьютере и является простым в использовании. Вы можете открыть его, выполнив поиск Очистка диска в меню «Пуск».
Позвольте ему сканировать, и вы увидите несколько категорий файлов, которые вы можете стереть. Для получения дополнительных параметров выберите Очистить системные файлы, чтобы получить права администратора.
Если вам кажется, что это слишком старая школа, вы можете перейти в « Настройки»> «Система»> «Хранилище», чтобы попробовать более новый инструмент очистки хранилища в Windows 10. Нажмите Free up space сейчас, чтобы использовать его.
Что удалить в очистке диска
Это не полное руководство по инструменту очистки диска, поэтому мы не будем рассматривать все варианты, которые он предлагает. Тем не менее, следующие несколько опций являются обязательными (не забудьте выбрать Очистить системные файлы, чтобы увидеть их все):
1. Файл гибернации
Расположение: C: \ hiberfil.sys
Режим гибернации на вашем компьютере аналогичен спящему режиму, за исключением того, что система сохраняет всю открытую работу на жестком диске, а затем выключается. Вы можете извлечь аккумулятор из вашего ноутбука и оставаться в спящем режиме в течение недели, а затем начать работу и оставаться там, где вы остановились.
Конечно, это занимает место, для чего предназначен файл гибернации.
Это все, что нужно, чтобы отключить спящий режим. Windows должна удалить hiberfil.sys самостоятельно, когда вы это сделаете; не стесняйтесь удалить его, если нет. Обратите внимание, что отключение режима гибернации также не позволяет вашему компьютеру использовать быстрый запуск в Windows 10. Однако это не большая потеря, поскольку известно, что эта функция вызывает проблемы с загрузкой.
2. Папка Windows Temp
Расположение: C: \ Windows \ Temp
Как можно догадаться из названия, временные файлы Windows не важны за пределами их первоначального использования. Файлы и папки внутри содержат информацию, которую Windows использовала когда-то, но больше не нужна.
Помимо очистки с помощью Disk Cleanup. Вы можете посетить эту папку и удалить ее содержимое, нажав Ctrl + A выбрать все, а затем нажмите удалить. Когда вы делаете это, Windows может выдать вам ошибку о паре элементов — просто проигнорируйте их и очистите все остальное.
3. Корзина
Расположение: shell:RecycleBinFolder
Технически, Корзина — это не папка. И хотя это может быть очевидным для некоторых, мы включаем это в случае, если некоторые читатели не знают.
Каждый раз, когда вы удаляете файл в своей системе, Windows отправляет его в корзину. Это особое место, где удаленные файлы хранятся до тех пор, пока вы не удалите их навсегда или не восстановите. Если вы не помните, чтобы регулярно очищать корзину, там может быть несколько гигабайт старых данных.
Вы можете получить доступ к корзине через ярлык на рабочем столе. Если у вас его нет, введите shell: RecycleBinFolder в панели навигации Проводника. Оказавшись здесь, вы увидите все, что вы недавно удалили.
Вы можете щелкнуть правой кнопкой мыши по отдельным элементам и выбрать « Удалить», чтобы навсегда удалить их, или « Восстановить», чтобы отправить файл обратно в исходное местоположение. На ленте выше вы увидите кнопки для очистки корзины и восстановления всех элементов.
С помощью этого параметра Windows пропускает корзину и удаляет элементы без возможности восстановления при их удалении. Мы не рекомендуем этого, потому что корзина дает вам второй шанс в случае ошибки.
4. Папка Windows.old
Расположение: C: \ Windows.old
При необходимости вы можете использовать эту папку для отката к предыдущей версии Windows. Вы также можете открыть папку и взять несколько ненужных файлов, если вам нужно.
Windows автоматически удаляет эту папку через короткое время, но вы можете удалить ее самостоятельно, если вам не хватает места. Он не удалится, если вы попытаетесь пройти через проводник, поэтому введите « Очистка диска» в меню «Пуск» и запустите инструмент, как описано ранее.
Нажмите Очистить системные файлы в нижней части окна и позвольте утилите выполнить повторное сканирование. После этого найдите предыдущие установки Windows и удалите их с помощью этого инструмента.
Очевидно, что удаление этих файлов затрудняет восстановление данных в случае возникновения проблемы. После обновления до Windows (даже до последней версии Windows 10) мы советуем вам сохранять эту папку, пока вы не убедитесь, что все работает правильно.
5. Загруженные программные файлы
Расположение: C: \ Windows \ Загруженные программные файлы
Название этой папки немного сбивает с толку. На самом деле она содержит файлы, используемые элементами управления ActiveX Internet Explorer и апплетами Java, поэтому, если вы используете одну и ту же функцию на веб-сайте, вам не нужно загружать ее дважды.
По сути, эта папка бесполезна. ActiveX является чрезвычайно устаревшей технологией, которая полна дыр в безопасности, и Java редко используется в современной сети. ActiveX является эксклюзивным для Internet Explorer, и вы, вероятно, встретите его только на древних корпоративных сайтах.
Большинство домашних пользователей больше не используют IE, не говоря уже о ActiveX. Ваша папка « Загруженные программные файлы » может быть уже пустой, но вы можете очистить ее содержимое, если это не так.
6. LiveKernelReports
Место нахождения: C: Windows LiveKernelReports
Расположение: C: \ Windows \ LiveKernelReports
Любые огромные файлы, заканчивающиеся расширением DMP в этой папке, можно безопасно удалить. Как и в приведенных выше местах, мы рекомендуем использовать очистку диска вместо удаления файла самостоятельно.
Если происходит сбой Windows или возникают другие серьезные проблемы с компьютером, не удаляйте эти файлы дампа сразу. Вы можете использовать такую программу, как WhoCrashed, чтобы получить от них больше информации.
7. Rempl Папка
Расположение: C:\Program Files\rempl
Хотя папка Rempl невелика, вы можете удивиться, увидев ее в своей системе. Он содержит несколько небольших файлов, и вы можете даже заметить несколько процессов диспетчера задач, связанных с ним.
Эта папка подключена к доставке обновлений Windows 10. Он включает в себя « улучшения надежности», которые помогут сделать обновления Windows 10 гладкими и устранить проблемы совместимости.
Так вы можете удалить папку Rempl? По-видимому, никаких негативных последствий от этого нет. Тем не менее, поскольку он занимает всего несколько мегабайт и может сделать обновления Windows менее сложными, лучше его оставить.
Какие папки Windows вы удаляете?
Требуется немного осмотреться, но Windows содержит множество ненужных файлов и папок, таких как папки «Фото» и «Сохраненные изображения». Помните, что ваш компьютер неплохо поддерживает себя в чистоте, поэтому вам не нужно навязчиво удалять содержимое этих папок, если у вас достаточно места на диске.
Symbols for Windows debugging (WinDbg, KD, CDB, NTSD)
Symbol files hold a variety of data which are not actually needed when running the binaries, but which could be very useful in the debugging process.
Symbols can include the name, type (if applicable), the address or register where it is stored, and any parent or child symbols. Examples of symbols include variable names (local and global), functions, and any entry point into a module.
The debugger gets its information about symbols from symbol files, which are located on the local file system or loaded from a remote symbol server. When using a symbol server, the debugger will automatically use the correct version of the symbol file to match the module in the target.
Symbols for the Windows debuggers (WinDbg, KD, CDB, and NTSD) are available from a public symbol server via the internet.
Symbols can be loaded automatically using the .symfix (Set Symbol Store Path) command, as long as you have access to the internet while your debugger is running. Then use the .reload (Reload Module) command to load the symbols.
If you are performing user-mode debugging, you will need symbols for your target application. If you are performing kernel-mode debugging, you will need symbols for the driver you are debugging, as well as the Windows public symbols.
These topics explain how to access symbols during a debugging session, how to control the debugger’s symbol options and symbol matching.
These topics explain what symbols are, as well as describe WinDbg support for Portable PDB symbols.
For additional detail on working with symbols refer to these pages.
If you simply want to configure your debugger to access symbols for your own programs and for Windows, you may find it quicker to read the less-detailed introductory topics Symbol Path and Microsoft public symbol server. Use the Use !sym noisy command to display additional detail as symbols are loaded to troubleshoot issues with symbols.
Microsoft Windows debugging symbols можно ли удалить?
Debugging using Windbg : Symbols loading
To use the symbols for debugging, we need to tell windbg which directories it should look into, to find the symbols. To do this, click on File menu and then Symbol File Path. You can enter the path as shown in the below image.
The symbol path in this example is srv*c:symbols*//msdl.microsoft.com/download/symbols.
The first path is a local directory and the second path is the Microsoft’s symbol server path. This path is required to get the symbols for Windows libraries shell32.dll, gdi32.dll, advapi32.dll, kernel32.dll, ntdll.dll and many more libraries. The application we need to debug might be using these libraries.
Loading symbols after setting the path
After setting the symbol search path we need to load the symbols for all the loaded modules in memory. For this run the below command.
.reload /f myapplication.exe
In this command you need to provide the full name of the binary name along with the extension. Otherwise you might see the message below.
“Myapplication” was not found in the image list.
Debugger will attempt to load “Myapplication” at given base 00000000`00000000.
Please provide the full image name, including the extension (i.e. kernel32.dll)
for more reliable results.
Issues with symbols loading
DBGHELP: myapplication – no symbols loaded
As you can see none of the symbol search paths have the Myapplication.pdb file. Before looking at how to fix this issue, let’s understand how windbg interpretes the symbol server path.
Understanding ‘SRV’ in symbol server path
Another thing you can notice in the above error is that, Windbg looks for the symbols files in a sub directory with the name myapplication.pdb/38266E74B06B4EF3BCC16713A4A1E5E82. This is because we used the keyword SRV in the symbol search path which indicates that this path need to be used as a symbol server path.
pdb/38266E74B06B4EF3BCC16713A4A1E5E82/myapplication.pdb not found
DBGHELP: c:localsymbolsmyapplication.pdb – mismatched pdb
DBGHELP: c:localsymbolsexemyapplication.pdb – file not found
DBGHELP: c:localsymbolssymbolsexemyapplication.pdb – file not found
DBGHELP: Couldn’t load mismatched pdb for myapplication.exe
*** ERROR: Module load completed but symbols could not be loaded for myapplication.exeDBGHELP: myapplication – no symbols loaded
Now we are into another problem. Windbg detected the symbol file but it says that the symbol file is not matching with the exe file. Let’s see how to fix this in the next section.
Symbol file not matching
If you see this issue, you need to crosscheck with your build numbers and pick up the right pdb file. If you are sure that the pdb file you are using is the right one, but still seeing this message, then you can use /i switch to load the symbols even if there is no match.
DBGHELP: c:localsymbolsmyapplication.pdb – mismatched pdb
DBGHELP: c:localsymbolsexemyapplication.pdb – file not found
DBGHELP: c:localsymbolssymbolsexemyapplication.pdb – file not found
DBGHELP: Loaded mismatched pdb for myapplication.exe
DBGENG: myapplication.exe has mismatched symbols – type “.hh dbgerr003” for details DBGHELP: myapplication – private symbols & lines
As you can see it looks for a matching pdb in all the search paths. As it does not find any, it loads the mismatched pdb in the end.
I hope this post has helped you in understanding how symbols loading works in Windbg. If something is not clear to you, or if you have any other questions, please share it in the comments below.
Relevant posts:
Windbg commands reference
Download Windbg
Debugging: Развертывание сервера отладочной информации
Копая залежи документов на своем рабочем компе обнаружил инструкцию по развертыванию сервера отладочной информации, которую писал два-три года назад. Попробую представить её хабросообществу. Данная инструкция будет полезна C++ разработчикам под Windows, которые хотят использовать отладку релизных версий своего продукта (удаленно и напрямую, на своих компах и компах тестировщиков), а также делать разбор крашдампов (postmortem debugging).
1. Подготовка окружения
Для развертывания хранилища отладочных сиволов понадобится: Следует установить дистрибутив Debugging Tools For Windows (будем считать, что дистрибутив установлен в папку “C:\Program Files\Debugging Tools For Windows”), и установить все дистрибутивы отладочных символов операционных систем в какую либо папку (будем считать, что они установлены в папку “C:\TempSymbols”).
2. Организация хранилища отладочной информации
Хранилище символов будем организовывать используя сервер отладочной информации symsrv.dll компании Microsoft. Для этого создадим папку для хранилища символов, например C:\Symbols. Далее следует установить на неё права на чтение для любых пользователей компьютера. Следующим шагом станет добавление файлов отладочных символов в хранилище. Для этого используем программу “symstore.exe” из комплекта Debugging Tools For Windows. Выполним следующую команду:
symstore add /r /3 /f c:\TempSymbols\*.* /s c:\Symbols /compress
данная команда пройдет по всем вложеным папкам каталога “c:\TempSymbols” и скопирует оттуда бинарные файлы и файлы с отладочной информацией в трёхуровневое хранилище символов расположенное в папку “C:\Symbols”. Архивирует их и создаст индексные файлы для ускорения доступа и хранения информации о транзакциях доступа на изменение хранилища. Описание ключей этой команды:
Команда будет выполнятся достаточно долго и результатом её выполнения будет создание хранилища отладочной информации в папке “C:\Symbols”. После данного этапа папку “C:\TempSymbols” можно удалить.
3. Организация доступа к хранилищу отладочной информации через протокол http
На данном этапе следует настроить Internet Information Services на предоставление доступа к хранилищу. Вначале следует создать виртуальную папку:
Далее следует настроить типы MIME.
4. Инсталляция прокси-фильтра для обновления символов через интернет
Прокси-фильтр нужен для того чтобы отладчик не нешедший необходимые ему файлы отладочных символов попытался взять из из публичного хранилища Microsoft, тем самым выполнив обновление хранилища символов. Прокси фильтр предоставляемый компанией Microsoft в наборе Debugging Tools For Windows является ISAPI расширением и находится в каталоге “C:\Program Files\Debugging Tools For Windows\symproxy”. Установим прокси фильтр:
Настроим IIS на работу с прокси-фильтром:
Запустим файл “iisreset.exe” чтобы рестартовать IIS с новыми настройками.
5. Настройка параметров прокси сервера для symproxy.dll
В Debugging Tools For Windows есть недочет, связанный с тем, что “symproxy.dll” не перенаправляет вызовы на получение сжатых файлов отладочных символов на сайт Microsoft если “symproxy.dll” работает с интернетом напрямую (без прокси сервера). Для того чтобы устранить данный дефект необходимо поставить локальный прокси сервер и с помощью утилиты “proxycfg.exe” настроить систему на работу с прокси сервером.
6. Настройка клиентских компьютеров на работу с сервером отладочной информации
На каждом клиентском компьютере (компьютере разработчика) следует создать папку для кеширования символов, например “C:\LocalSymbols”. Установить дистрибутив Debugging Tools For Windows и создать переменные окружения:
Первая переменная отвечает за путь поиска отладочных символов, вторая за поиск бинарников которые подходят к этим символам (необходима при разборе крашдампов, т.е. когда у вас нет непосредственного доступа к бинарникам упавшей программы).
Резюме
Итак, опишу полученый результат. У нас теперь есть сервер, на котором находятся отладочные символы операционных систем и некоторых библиотек и продуктов Microsoft. При этом если идет к серверу обращение на получение символов какой-то новой версии софта, то этот запрос будет переадресован на сайт Microsoft, символы будут скачаны оттуда и лягут на ваш сервер.
На компьютерах девелоперов у вас будет организован локальный репозиторий символов, которые будут скачиваться с вашего сервера символов по требованию отладчика (Visual Studio, WinDbg и т.п.). Для полноты работы символьного сервера вам остается только добавить в вашу систему сборки:
Заключение
Данная инструкция, как я и говорил, была написана 2-3 года назад, поэтому там фигурирует компьютер с Win2003, думаю вам не составит труда по аналогии развернуть сервер символов на Win2008 и последней версии IIS. Да и виртуалки, на которой можно было бы снять скриншоты настроки, тоже не оказалось. Но описание достаточно детальное, поэтому думаю что вы разберетесь.
Возможно проблема описанная в пункте 5 уже не актуальна, я не проверял.
Более детальную информацию по работе с серверами отладочной информации можно почерпнуть их хелп файла Debugging Tools For Windows, для затравки скажу что ещё можно привязать ваш сервер отладочной информации с сервером хранения исходников, и тогда при разборе крашдампа вы сможете видеть не только стек падения программы, но и место в исходниках, валидных на момент сборки.
Debugging tools for windows использование. Windows Debugging Tools: диагностика и исправление BSOD. Добавление символов во время отладки
Для выявления причин возникновения синих экранов (BSOD) требуется произвести анализ дампа памяти. В подавляющем большинстве случаев достаточно минидампа, который создается системой при критических ошибках.
В этой статье содержится пошаговая инструкция по установке и настройке WinDBG — мощного средства отладки, позволяющего выявить истинную причину возникновения BSOD.
Шаг 2 — Установка WinDBG
Для проведения анализа дампов памяти вам понадобится установить отладчик WinDBG, который входит в состав пакета Windows SDK. На момент написания статьи последние доступные версии Windows SDK:
Шаг 3 — Сопоставление файлов.dmp с WinDBG
Для упрощения процедуры чтения и анализа дампов памяти выполните сопоставление файлов.dmp с WinDBG. Это позволит открывать файлы дампов из проводника сразу в WinDBG минуя его предварительный запуск.
Шаг 4 — Настройка сервера символов для получения файлов символов отладки
Установка и первичная настройка WinDBG завершена. Для того, чтобы изменить его внешний вид можете перейти в меню View — настройки шрифтов вы найдете выбрав пункт Font, а настройки окон консолей в Options.
В момент критического сбоя операционная система Windows прерывает работу и показывает синий экран смерти (BSOD). Содержимое оперативной памяти и вся информация о возникшей ошибке записывается в файл подкачки. При следующей загрузке Windows создается аварийный дамп c отладочной информацией на основе сохраненных данных. В системном журнале событий создается запись о критической ошибке.
Внимание! Аварийный дамп не создается, если отказала дисковая подсистема или критическая ошибка возникла на начальной стадии загрузки Windows.
Типы аварийных дампов памяти Windows
На примере актуальной операционной системы Windows 10 (Windows Server 2016) рассмотрим основные типы дампов памяти, которые может создавать система:
Как включить создание дампа памяти в Windows?
С помощью Win+Pause откройте окно с параметрами системы, выберите «Дополнительные параметры системы» (Advanced system settings). Во вкладке «Дополнительно» (Advanced), раздел «» (Startup and Recovery) нажмите кнопку «Параметры» (Settings). В открывшемся окне настройте действия при отказе системы.
Поставьте галку в чек-боксе «Записать события в системный журнал» (Write an event to the system log), выберите тип дампа, который должен создаваться при сбое системы. Если в чек-боксе «Заменять существующий файл дампа» (Overwrite any existing file) поставить галку, то файл будет перезаписываться при каждом сбое. Лучше эту галку снять, тогда у вас будет больше информации для анализа.
Отключите также автоматическую перезагрузку системы (Automatically restart).
В большинстве случаев для анализа причины BSOD вам будет достаточно малого дампа памяти.
Теперь при возникновении BSOD вы сможете проанализировать файл дампа и найти причину сбоев. Мини дамп по умолчанию сохраняется в папке %systemroot%\minidump. Для анализа файла дампа рекомендую воспользоваться программой WinDBG(Microsoft Kernel Debugger).
Установка WinDBG в Windows
Файл называется winsdksetup.exe, размер 1,3 МБ.
Запустите установку и выберите, что именно нужно сделать – установить пакет на этот компьютер или загрузить для установки на другие компьютеры. Установим пакет на локальный компьютер.
Можете установить весь пакет, но для установки только инструмента отладки выберите Debugging Tools for Windows.
После установки ярлыки WinDBG можно найти в стартовом меню.
Настройка ассоциации.dmp файлов с WinDBG
Для того, чтобы открывать файлы дампов простым кликом, сопоставьте расширение.dmp с утилитой WinDBG.
Настройка сервера отладочных символов в WinDBG
Отладочные символы (debug-символы или symbol files) – это блоки данных, генерируемые в процессе компиляции программы совместно с исполняемым файлом. В таких блоках данных содержится информация о именах переменных, вызываемых функциях, библиотеках и т.д. Эти данные не нужны при выполнении программы, но полезные при ее отладке. Компоненты Microsoft компилируются с символами, распространяемыми через Microsoft Symbol Server.
Настройте WinDBG на использование Microsoft Symbol Server:
WinDBG произведет поиск символов в локальной папке и, если не обнаружит в ней необходимых символов, то самостоятельно загрузит символы с указанного сайта. Если вы хотите добавить собственную папку с символами, то можно сделать это так:
Анализ аварийного дампа памяти в WinDBG
Отладчик WinDBG открывает файл дампа и загружает необходимые символы для отладки из локальной папки или из интернета. Во время этого процесса вы не можете использовать WinDBG. Внизу окна (в командной строке отладчика) появляется надпись Debugee not connected.
Команды вводятся в командную строку, расположенную внизу окна.
Основные моменты, на которые вы должны обратить внимание при анализе после выполнения команды!analyze –v (листинг неполный).
* ** Bugcheck Analysis ** ****************************************************************************** Символическое имя STOP-ошибки (BugCheck) KERNEL_SECURITY_CHECK_FAILURE (139)
Описание ошибки (Компонент ядра повредил критическую структуру данных. Это повреждение потенциально может позволить злоумышленнику получить контроль над этой машиной):
A kernel component has corrupted a critical data structure. The corruption could potentially allow a malicious user to gain control of this machine.
Аргументы ошибки:
Arguments:Arg1: 0000000000000003, A LIST_ENTRY has been corrupted (i.e. double remove).Arg2: ffffd0003a20d5d0, Address of the trap frame for the exception that caused the bugcheckArg3: ffffd0003a20d528, Address of the exception record for the exception that caused the bugcheckArg4: 0000000000000000, ReservedDebugging Details:
Счетчик показывает сколько раз система упала с аналогичной ошибкой:
Код STOP-ошибки в сокращенном формате:
Процесс, во время исполнения которого произошел сбой (не обязательно причина ошибки, просто в момент сбоя в памяти выполнялся этот процесс):
Расшифровка кода ошибки: В этом приложении система обнаружила переполнение буфера стека, что может позволить злоумышленнику получить контроль над этим приложением.
ERROR_CODE: (NTSTATUS) 0xc0000409 — The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.
EXCEPTION_CODE: (NTSTATUS) 0xc0000409 — The system detected an overrun of a stack-based buffer in this application. This overrun could potentially allow a malicious user to gain control of this application.
Последний вызов в стеке:
LAST_CONTROL_TRANSFER: from fffff8040117d6a9 to fffff8040116b0a0
Стек вызовов в момент сбоя:
000000ee`f25ed2b8 00000000`00000000: 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000: 0x00007f`475307da
Участок кода, где возникла ошибка:
Имя модуля в таблице объектов ядра. Если анализатору удалось обнаружить проблемный драйвер, имя отображается в полях MODULE_NAME и IMAGE_NAME:
MODULE_NAME: nt
IMAGE_NAME: ntkrnlmp.exe
Windows Debugging Tools: диагностика и исправление BSOD. Установка и настройка WinDBG для анализа дампов памяти Существующие отладочные сессии
В момент критического сбоя операционная система Windows прерывает работу и показывает синий экран смерти (BSOD). Содержимое оперативной памяти и вся информация о возникшей ошибке записывается в файл подкачки. При следующей загрузке Windows создается аварийный дамп c отладочной информацией на основе сохраненных данных. В системном журнале событий создается запись о критической ошибке.
Внимание! Аварийный дамп не создается, если отказала дисковая подсистема или критическая ошибка возникла на начальной стадии загрузки Windows.