Налагодження символи, блог по windows
Так ось, до певного часу ніякі додаткові файли, які полегшують процес налагодження, дослідникам коду не надавалися.
- бути представлена блоком даних, вбудованим в бінарний виконуваний файл, тобто перебувати всередині виконуваного файлу. Чи не найкращий спосіб зберігання налагоджувальних символів, оскільки іноді розмір виконуваного файлу може істотно збільшуватися.
- бути розміщена у вигляді окремого зовнішнього файлу, що знаходиться або в директорії з бінарним файлом, або в спеціалізованій незалежної директорії. Подібний спосіб розміщення символів найбільш універсальний.
- зовсім відсутні. Тобто не створюватися на етапі компіляції і / або збірки. У більшості випадків так і відбувається :)
Для конкретної версії виконуваного коду компілятор створює свій унікальний файл символів.
Це має під собою досить просту підгрунтя, адже налагоджувальні символи жорстко прив'язані до конкретного вихідного коду, і якщо в вихідному коді щось змінюється (рядок, процедура, змінна), то старе відповідність перестає бути актуальним і потрібно згенерувати новий файл символів, який в точності відповідає вже новому, зміненому вихідного коду. З точки зору розробника варто врахувати і той факт, що потенційно будь-яка зміна проекту викликає повну несумісність між файлів символів і компонентом, тому файли символів і бінарні файли потрібно будувати одночасно. З точки зору дослідника необхідно пам'ятати, що файли налагоджувальних символів змінюються при кожній новій збірці (build), тому процес оновлення системи вимагає також і оновлення файлів налагоджувальних символів, що відносяться до системних модулів. Ось чому досить зручно використовувати автоматизований процес запиту символів, щоб не відволікатися на ручну синхронізацію.
Чи потрібні символи
Отладчик WinDbg корпорації Microsoft можна конфігурувати на автоматичний запит налагоджувальної інформації, якщо в ній є необхідність. От саме основне питання, на який я хотів сам собі відповісти, чи потрібні ці самі налагоджувальні символи чи ні? Я провів найпростіший експеримент, який полягав у тому, що я знайшов завалявся у мене на тестовій станції дамп падіння в синій екран (BSOD) і підключив його спочатку в WinDbg з доступними символами, а потім в тому ж WinDbg без символів, і ось результат:
У процесі налагодження 32-бітових додатків зустрічаються ситуації, коли без використання символів Ви не зможете отримати достовірну трасування стека.

поширення
Ясна річ, що якщо символи офіційно надають, то їх необхідно якимось чином поширювати, для того, що б кінцеві споживачі програмного продукту мали можливість, при гострому на те бажанні звичайно ж, цей самий продукт налагоджувати, тобто в разі виникнення помилок мати можливість швидко знаходити ймовірну причину виникнення. Яким же чином налагоджувальні символи надають своєї цільової аудиторії? До деяких пір розробники, перед якими стояло завдання надання налагоджувальних символів своїм клієнтам, передавали подібну інформацію для своїх продуктів на оптичних носіях, дисках CD / DVD. Винятком не стала і операційна система Windows, яка може поставлятися з налагоджувальними символами, традиційно розміщуються на додатковому диску дистрибутива, або в складі Driver Development Kit (DDK). Однак, з певного часу популярним став метод поширення символів через мережу Інтернет. У мережі для цієї мети Microsoft розміщує власні сервера символів, які і надають налагоджувальні символи, однак, щоб працювати з сервером символів, необхідно використовувати спеціалізований протокол обміну.
Сервер символів Microsoft
Багато компонентів, що розробляються корпорацією Microsoft, такі як файли, що входять до складу операційних систем, офісних додатків і інших продуктів, компілюються разом з символами, які потім поширюються через сервер символів Microsoft (Microsoft Symbol Server). Сервер символів є онлайновий репозиторій публічних символів для продуктів Microsoft, який доступний для запиту за допомогою протоколу HTTP по візуально-що не відображаються шляху (URL):
Це доступне в мережі Інтернет сховище всіх символів для всіх суспільних товарів, випущених Microsoft за останні кілька років. Величезний плюс надання налагоджувальних символів онлайн полягає в тому, що все отладчики Microsoft (незалежні як WinDbg. KD і поставляються в складі продуктів, як MS Visual Studio Debugger), а так же ряд сторонніх налагоджувальних засобів, тепер мають можливість автоматично завантажувати символи безпосередньо з сервера в залежності від версії отлаживаемого двійкового коду. Звісно ж, скільки часу можна заощадити в порівнянні з ситуацією, коли Ви в ручному режимі змушені підчіплювати символи саме тієї версії модуля, яку ви налагоджувати в даний момент.
Варто відзначити, що на сервері символів Microsoft надають тільки публічні символи, тобто "урізану" інформацію по структурі бінарного коду. Виняток становлять деякі типи в файлі ntdll.dll і модулі ядра.
Публічні та приватні символи
Як Ви вже зрозуміли, інформація в файлах символів може відрізнятися за ступенем повноти. За замовчуванням, символьні файли, що генеруються C / C ++ компоновщиком, містять досить багато інформації про виконуваному файлі, зазвичай більше, ніж більшість розробників програмного забезпечення готові надавати своїм клієнтам. У зв'язку з цим, після створення видаляють інформацію по приватним символам з PDB-файлів і отримують на виході те, що називають публічними символами (public symbols) або обрізаними символами (stripped symbols). Ці "обрізання" публічні символи не можуть бути використані для налагодження в режимі вихідного тексту, тому що вихідного тексту в них просто немає, як немає і інформації за номерами рядків у вихідному файлі. Публічні символи, так само, не включають інформацію для допомоги по відображенню параметрів більшості функцій, інформацію по локальних змінних, типів локальних змінних. Проте, вони містять достатньо інформації для ключових налагоджувальних сценаріїв, що часто є достатнім. Таким чином, можна зробити втішний висновок:
Публічних символи містять мінімум інформації, якою, однак, цілком достатньо для більшості сценаріїв надійної налагодження.
Символьні файли, поширювані корпорацією Microsoft, включають в себе виключно публічні функції, глобальні змінні і їх типи даних, тобто є публічними. На противагу цьому, деякі розробники програмного забезпечення (Mozilla) поширюють повну зневадження (публічні символи і приватні символи). Приватний (повні, закриті) символи (private symbols) містять значно більше інформації, що включає в себе шлях і номера рядків вихідного коду, імена і типи параметрів функцій і змінних.
формат PDB
З часу того, як налагоджувальні символи стали масово затребувані спільнотою фахівців, багато розробників програмного забезпечення вирішили створити різноманітних методів зберігання інформації про вихідні файлах в модулях символів. У зв'язку з чим, в природі з'явилися всілякі формати запису символів. Нас же, в контексті даної статті, цікавлять формати зберігання символів для продуктів Microsoft.
У загальному випадку, символи можуть бути надані в наступних форматах:
- Файли .COFF. містять дані у форматі Common Object File Format (COFF);
- Файли .CV. містять дані у форматі CodeView. Формат зберігання символів від Microsoft. застарілий;
- Файли .SYM (Symbols). Застарілий формат;
- Файли .DBG (Debug), що містять дані у форматі COFF (Common Object File Format). Досить поширений формат, сумісний з великою кількістю старих отладчиков. Однак, не може містити інформацію по рядках вихідного коду;
- Файли .PDB (Program Database), що містять дані у форматі MSF (Multi-Stream Files). Сучасний просунутий формат, розроблений Microsoft. Може містити набагато більше інформації, ніж .dbg.
Однак ми будемо розглядати в даній статті лише формат PDB, який є найсучаснішим, відповідно і кращим форматом для різних засобів розробки від Microsoft.
Всі дані, які PDB файл може містити:
- Публічні символи: всі функції, статичні та глобальні змінні;
- Список об'єктних файлів які відповідають за секції коду в виконуваному файлі;
- Інформація про оптимізації покажчика фрейму стека (FPO);
- Імена локальних змінних;
- Тип локальних змінних. Завдяки цьому відладчик або дизассемблер можуть не тільки зчитувати з пам'яті значення змінних, але і виводити ці значення на екран в певному виді (в залежності від типу змінної);
- Імена структур даних;
- Тип структур даних;
- Приватний символи: вихідний текст програми;
- Приватний символи: інформація про номери рядків у вихідному тексті;
PDB файл служить для:
На прикладі відладчика WinDbg можна сказати, що він "вміє" автоматично завантажувати файли налагоджувальних символів в форматі PDB, з сервера за допомогою підбору різних критеріїв (мітка часу, контрольна сума (CRC) одно- / багатоядерність) за допомогою SymSrv (SymSrv.dll). Стандартний протокол пошуку символів працює з сервером символів Microsoft.
Не знаю, чи вийшло у мене розкрити тему, але деякі висновки в процесі вивчення теми я все ж для себе зробив. Головний висновок, який можна зробити після прочитання матеріалу - налагоджувальні символи значно спрощують процес налагодження програмного забезпечення і дозволяють скоротити час, що витрачається на розуміння алгоритму роботи і на пошук джерело проблеми.