Відпустіть генерацію .pdb файлів, чому?


264

Чому Visual Studio 2005 створює .pdbфайли під час компіляції у випуску? Я не буду налагоджувати версію версії, то чому вони створюються?


18
Навіщо генерувати pdb при повторному випуску? Отже, коли звіт про аварії надходить з дикої природи, у вас є інформація про його налагодження. Інша цінність полягає в тому, що клієнти можуть налагоджувати її, коли оригінальний автор цього не зробить.
Ян Бойд

@IanBoyd: Друге речення цього коментаря означає, що ви розгорнете PDB. Це в переважній більшості випадків не бажано.
Неочікуваний

3
@IInspectable Або бажано
Ian Boyd

@IanBoyd: Переважна більшість випадків не включає розгортання ОС. Крім того, ці PDB не містять приватних символів, які за замовчуванням включаються при створенні PDB.
Неочікуваний

@IInspectable З іншого боку, випустивши PBDs є бажаним. В ідеалі, так, кожен писав би код, складений в IL, щоб ми могли самі отримати інформацію про символи. Але у місцевих компіляторів коду все ще немає простого способу підтримати налагодження в цьому полі.
Ян Бойд

Відповіді:


416

Оскільки без файлів PDB неможливо було б налагодити збірку "Release" за допомогою іншого, крім налагодження на рівні адрес. Оптимізація дійсно робить номер вашого коду, що ускладнює пошук винуватця, якщо щось піде не так (скажімо, викинутий виняток). Навіть встановлення точок прориву є надзвичайно важким, оскільки рядки вихідного коду не можуть бути зіставлені один на один із (або навіть у тому ж порядку, що і) згенерованим кодом складання. Файли PDB допомагають вам і налагоджувачу, полегшуючи налагодження після смертей.

Ви вказуєте на те, що якщо ваше програмне забезпечення готове до випуску, ви повинні були виконати всі налагодження до того часу. Хоча це, безумовно, правда, є кілька важливих моментів, які слід пам’ятати:

  1. Ви також повинні протестувати свою програму та налагоджувати її (перш ніж випустити її) за допомогою збірки "Випуск". Це тому, що ввімкнення оптимізацій (вони відключені за замовчуванням у конфігурації "Налагодження") іноді можуть спричинити появу тонких помилок, які ви б інакше не спіймали. Під час налагодження вам потрібні символи PDB.

  2. Клієнти часто повідомляють про крайові випадки та помилки, які з'являються лише в "ідеальних" умовах. Це речі, які майже неможливо відтворити в лабораторії, оскільки вони покладаються на якусь хитру конфігурацію машини цього користувача. Якщо вони особливо корисні клієнтам, вони повідомлять про виняток, який було викинуто, і нададуть вам слід стека. Або вони навіть дозволять вам позичити їхню машину для віддаленої налагодження програмного забезпечення. У будь-якому з цих випадків вам потрібно, щоб файли PDB допомогли вам.

  3. Профілювання завжди слід робити на "Release" збірках з увімкненими оптимізаціями. І ще раз, файли PDB стануть у нагоді, оскільки вони дозволяють зібраним профілем інструкцій зі складання повернути до вихідного коду, який ви насправді написали.

Ви не можете повернутися та генерувати файли PDB після компіляції. * Якщо ви не створите їх під час збирання, ви втратили можливість. Це не завадить нічого створити їх. Якщо ви не хочете їх розповсюджувати, ви можете просто їх опустити зі своїх бінарних файлів. Але якщо згодом ви вирішите, що хочете їх, вам не пощастить. Краще завжди генерувати їх і архівувати копію, на всякий випадок, якщо вони вам коли-небудь знадобляться.

Якщо ви дійсно хочете їх вимкнути, це завжди варіант. У вікні "Властивості" вашого проекту встановіть для параметра "Інформація про налагодження" значення "немає" для будь-якої конфігурації, яку потрібно змінити.

Чи є до відома, однак, що конфігурації «Debug» і «Release» зробити за замовчуванням використовує різні настройки для випромінювання налагоджувальної інформації. Ви хочете зберегти цей параметр. Параметр "Інформація про налагодження" встановлений на "повний" для збірки налагодження, що означає, що крім файлу PDB, інформація про налагодження вбудовується в збірку. Ви також отримуєте символи, які підтримують цікаві функції, такі як редагування та продовження. У режимі випуску вибирається параметр "лише для pdb", який, як це звучить, включає лише файл PDB, не впливаючи на зміст складання. Тож це не так просто, як проста наявність або відсутність файлів PDB у вашому /binкаталозі. Але якщо припустимо, що ви використовуєте опцію "лише для pdb", файл PDB "

* Як в коментарі зазначає Марк Шерман , доки ваш вихідний код не змінився (або ви можете отримати оригінальний код із системи управління версіями), ви можете відновити його та створити відповідний файл PDB. Принаймні, зазвичай. Це працює добре більшу частину часу, але компілятор не гарантує створення однакових двійкових файлів кожного разу, коли ви компілюєте один і той же код , тому можуть бути тонкі відмінності. Гірше, якщо ви тим часом зробили якісь оновлення вашої ланцюжка інструментів (наприклад, застосувавши пакет оновлень для Visual Studio), PDB-файли ще менше ймовірні. Для гарантування надійної генерації ex postfactoФайли PDB, вам потрібно буде архівувати не тільки вихідний код у вашій системі контролю версій, але й двійкові файли для всієї ланцюга інструментів збірки, щоб гарантувати точне відтворення конфігурації середовища збирання. Само собою зрозуміло, що набагато простіше просто створити та архівувати файли PDB.


19
"Ви не можете генерувати файли PDB після компіляції." - Якщо ваш вихідний код не змінився, ви можете відновити, щоб генерувати PDB після використання факту. За замовчуванням windbg не завантажує цей PDB, але ви можете змусити його завантажити, вказавши такий варіант / i, як цей .reload /i foo.dll. Це завантажить foo.pdb, навіть якщо foo.pdb був створений після випуску foo.dll.
Марк Шерман

Я помітив, що кожен новий компілятор має різний хеш-дайджест, тому є невеликі розбіжності з кожною збіркою навіть в одному середовищі. Чи можуть адреси PDB не змінюватися з відхиленням, отже, необхідність утримувати PDB від цієї збірки? Просто викладаючи це як ідею, оскільки я не дуже розумію, як працюють PDB або чому хеші змінюються між складаннями.
thebunnyrules

1
@ у виносці я посилався на статтю, в якій пояснюється, що "компілятор C # за дизайном ніколи не видає один і той же двійковий двійник. Компілятор C # вбудовує щойно сформований GUID у кожну збірку кожного разу, коли ви запускаєте його, тим самим забезпечуючи відсутність двох збірок. завжди бувають однакові по суті ". Це пояснює, чому він має інший хеш і, отже, інший файл PDB. Це можна виправити за допомогою шестигранного редактора, але не зручно для користувачів. А також поза межами цієї відповіді.
Коді Грей

3
У Росліні є нова особливість під назвою детерміновані побудови. "Прапор / детермінований прапор призводить до того, що компілятор видає такий самий EXE / DLL, байт для байтів, коли йому дано однакові входи." Це означає, що проект, оригінально складений із цим прапором, може бути перекомпільований у той самий двійковий код, якщо код, який ви компілюєте, є однаковим. Більш довге пояснення можна знайти у Детерміністичних будівлях у Росліні
К Сміт

92

PDB може бути створений Releaseяк для, так і для Debug. Це встановлено у (у VS2010, але у VS2005 має бути подібним):

Проект → Властивості → Створення → Розширений → Інформація про налагодження

Просто змініть його на None.


2
Але чому б ти це робив? Якщо ваше програмне забезпечення готове до випуску, тоді ви мали б виконати всі налагодження до цього часу
m.edmondson

4
Тому що ви можете налагоджувати проблеми виробництва. Одного разу нам довелося це зробити.
Аліостад

21
Перевагою заголовків PDB для виробничого коду є те, що .NET буде використовувати ці файли при передачі винятків. Він генерує сліди стека з іменами файлів та номерами рядків, що часто дуже зручно!
Стівен

6
@ m.edmondson: Так, це правильно. Ви все ще будете проінформовані , що викинуте виключення було (як FileNotFoundException), але ви не зможете побачити трасування стека. Це дуже важко чітко визначити, який рядок коду спричинив викид виключення.
Коді Грей

2
@ m.edmondson Просто додамо, якщо ви шукаєте інструмент для віддаленої налагодження однієї з проблем у виробничих коробках, тоді Windows SDK поставляється з дуже відомим інструментом під назвою WinDbg, який підтримує віддалену налагодження. Будь ласка, подивіться нижче згадане посилання. Сподіваюсь, це допомагає! msdn.microsoft.com/en-in/library/windows/hardware/…
RBT

8

Без файлів .pdb неможливо переступити через виробничий код; вам доведеться покладатися на інші інструменти, які можуть дорого і забирати багато часу. Я розумію, що ви можете використовувати трасування або windbg, наприклад, але це дійсно залежить від того, що ви хочете досягти. У певних сценаріях ви просто хочете перейти через віддалений код (без помилок чи винятків), використовуючи виробничі дані для спостереження за певною поведінкою, і саме тут .pdb файли стануть зручними. Без них запускати налагоджувач на цьому коді неможливо.


7

Чому ви настільки впевнені, що не будете налагоджувати версії версій? Іноді (сподіваємось, рідко, але трапляється), ви можете отримати з клієнта звіт про дефекти, який не може бути відтворений у версії налагодження з якихось причин (різні терміни, невелика інша поведінка чи що завгодно). Якщо ця проблема може бути відтворена у версії версії, ви будете раді мати відповідний pdb.


5
@ m.edmondson Отримайте доступ до віддаленої машини за допомогою RDP, Webex тощо та встановіть там windbg. Налаштуйте свій шлях символів та бамбу, ви золотий!
Марк Шерман

Посилання на більш детальний посібник було б кориснішим. Це однолінійне керівництво може призвести людей (як я) до неправильного шляху. Більшість розробників .NET нічого не знають, наприклад, про Windbg.
nuzzolilo

1
@ m.edmondson - Деякі видання Visual Studio мають можливість виконувати віддалену налагодження. З меню налагодження ви "приєднуєте для обробки" на віддаленій машині.
Матвій

Чи така гарна ідея віддаленого налагодження екземпляра виробничого додатка? Чи не порушить паралельне виконання потоків і змусить їх працювати послідовно під час налагодження?
Каве Аджарі

4

Крім того, ви можете використовувати звалища для злагодження свого програмного забезпечення. Клієнт надсилає вам його, а потім ви можете використовувати його для визначення точної версії вашого джерела - і Visual Studio навіть витягне потрібний набір символів налагодження (і джерело, якщо ви налаштовані правильно), використовуючи дамп для краху. Дивіться документацію Microsoft про магазини символів .


2

Файл .PDB - це коротка назва "База даних програми". Він містить інформацію про точку налагодження для налагоджувача та ресурси, які використовуються або посилаються. Його генерують, коли ми будуємо як режим налагодження. Це дозволяє застосувати до налагодження під час виконання.

Розмір збільшується .PDB-файлом у режимі налагодження. Він використовується, коли ми тестуємо нашу програму.

Хороша стаття файлу pdb.

http://www.codeproject.com/Articles/37456/How-To-Inspect-the-Content-of-a-Program-Database-P


1
"Немає необхідності у цьому файлі під час випуску чи розгортання", за винятком випадків, коли хтось зазнає збоїв у випущеній версії, а звіт про збій, який ви отримуєте від них, не містить сліду застосованого стека ... тоді ви хочете, щоб ви включили його після всі.
Nyerguds

Неправда. Без файлів .pdb ви отримаєте повний стектрейс, але без імен вихідних файлів. Ви можете відновити його вдома після отримання звіту про аварію. Якщо ви піклуєтесь про свої інтелектуальні права та придушуєте джерела, вам потрібно зберегти .pdb файли, але не розгортати їх.
ТОП КЕК

1

У мультипроектному рішенні зазвичай потрібно мати одну конфігурацію, яка взагалі не створює файлів PDB або XML. Замість того, щоб змінювати Debug Infoвластивість кожного проекту наnone , я вважав, що доцільніше буде додати подію після складання, яка працює лише у певній конфігурації.

На жаль, Visual Studio не дозволяє вказувати різні події після складання для різних конфігурацій. Тому я вирішив це зробити вручну, відредагувавши csprojфайл запуску проекту та додавши наступне (замість будь-якого існуючого PostBuildEventтегу):

  <PropertyGroup Condition="'$(Configuration)' == 'Publish'">
    <PostBuildEvent>
        del *.pdb
        del *.xml
    </PostBuildEvent>
  </PropertyGroup>

На жаль, це зробить текстовим полем події побудови повідомлення пустим, і введення нічого в нього може мати непередбачувані результати.


4
Це видалить ВСІ *.xmlфайли, будьте обережні.
Mariusz Jamro

0

Файли символів налагодження ( .pdb) та XML doc ( .xml) складають великий відсоток від загального розміру і не повинні входити до пакету звичайного розгортання. Але слід мати доступ до них у разі необхідності.

Один з можливих підходів: наприкінці процесу збирання TFS перемістіть їх до окремого артефакту.


-1

Насправді без файлів PDB та символічної інформації у них було б неможливо створити успішний звіт про аварійне завершення (файли демпінгу пам’яті), і Microsoft не матиме повного уявлення про те, що спричинило проблему.

Таким чином, наявність PDB покращує звітність про збої.


Але що саме пропаде без файлів .pdb?
ТОП КЕК

Ви не можете генерувати файли PDB після компіляції. Отже, кожну версію програмного забезпечення major.minor [.build [.revision]] слід було зберегти в Microsoft, щоб правильно зрозуміти, що сталося, але це ще не все.
prosti

Не гарантується, що компілятор створює однакові бінарні файли кожного разу, коли ви компілюєте один і той же код.
prosti

Питання полягало в тому, чого не вистачатиме у звітах про збої та як впливатиме на звітування про аварійне завершення роботи. Файли .NET pdb містять лише імена приватних змінних та імена вихідних файлів. Все інше (імена методів, підписи тощо) буде знаходитись у степі від інформації про метадані.
ТОП КЕК

Жоден файл PDB також не містить приватних даних: github.com/microsoft/microsoft-pdb .
prosti
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.