Яка різниця між налагодженням та випуском у Visual Studio?


Відповіді:


114

Найголовніше, що в режимі налагодження немає оптимізацій, тоді як в режимі випуску - оптимізації. Це важливо, оскільки компілятор дуже просунутий і може зробити досить складне поліпшення вашого коду на низькому рівні. Внаслідок цього деякі рядки вашого коду можуть залишитися без будь-яких інструкцій, а в деяких - все змішатись. Поетапна налагодження була б неможливою. Крім того, локальні змінні часто оптимізуються таємничими способами, тому годинники та QuickWatches часто не працюють, оскільки змінна "оптимізована". І є безліч інших оптимізацій. Спробуйте де-який час налагодити оптимізований код .NET, і ви побачите.

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


1
"В результаті деякі рядки вашого коду можуть залишитися без будь-яких інструкцій, а в деяких - все змішатися". YUP, помилявся на цьому, використовуючи рамки Stack, щоб отримати назву поточного методу / властивості - і багато властивостей було вкладено у випуску ...
kpollock

4
"Найголовніше - це те, що в режимі налагодження немає оптимізацій" - це сперечається. найголовніше - це інформація про налагодження, яка дозволяє налагоджувати. хоча це може існувати і у випуску.
shoosh

Я не знаю, який режим за замовчуванням (налагодження / випуск). Як правило, на моєму досвіді всі проекти знаходяться в режимі налагодження, і команда інсталятора подбає про цю версію, щоб уникнути pdb-файлу та ввести оптимізацію. Але сьогодні я зіткнувся з ситуацією, що режим змінено на випуск, і я не в змозі зламати код за допомогою точки перерви. Я багато років намагався робити багато речей і, нарешті, помічаю, що це пов'язано з проблемою з поточним режимом компіляції. @ Vlix- Дякую за вашу відповідь.
kbvishnu

1
Це фактично допомогло мені вирішити проблему "Ім'я" змінної "не існує в поточному контексті", з якою я стикався під час спроби аналізу символу в безпосередньому вікні під час налагодження програми, що відповідає конфігурації випуску за замовчуванням. Дуже дякую!
M463

1) Що з наступних питань? У проекті ASP.NET MVC є 3 конфігури: база (web), налагодження (web.debug), реліз (web.release). Припустимо, що ми встановлюємо налагодження та звільняємо рядок з'єднання шляхом перетворення у відповідний конфігурацію (налагодження та випуск). Під час публікації ми можемо публікувати згідно з нашим вибором у діалоговому вікні публікації. Але при запуску програми, не дивлячись на те, що я вибираю «Налагодження», він використовує конфігурацію випуску (тому що я встановлюю конфігурацію налагодження в базі та конфігурації налагодження), це нормально?
Джейсон

52

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

У режимі "Налагодження" у вас зазвичай є такі:

  • Файли баз даних налагодження програми, які дозволяють досить уважно стежити за виконанням програми у джерелі під час виконання.
  • Усі оптимізації вимкнено, що дозволяє перевіряти значення змінних та відстежувати функції, які в іншому випадку можуть бути оптимізовані за винятком або вбудованими
  • Визначення препроцесора _DEBUG, яке дозволяє писати код, який діє в режимі налагодження по-різному порівняно з випуском, наприклад, на інструменти ASSERT, які слід використовувати лише під час налагодження
  • Посилання на бібліотеки, які також були складені з параметрами налагодження, які, як правило, не розгорнуті для реальних клієнтів (з міркувань розміру та безпеки)

У режимі «Випуск» увімкнено оптимізацію (хоча є кілька варіантів), а визначення препроцесора _DEBUG не визначено. Зазвичай ви все-таки захочете генерувати файли PDB, оскільки дуже корисно мати можливість налагоджувати в режимі випуску, коли все працює швидше.


5
"всього дві мітки" - насправді Visual Studio дає можливість створювати більше! Це може бути надзвичайно корисно під час тестування програми. Наприклад, я нещодавно написав програму для своєї роботи, яка прийняла назви файлів з командного рядка. Я перевіряв свій синтаксичний розбір командного рядка, але як тільки це було зроблено, я не хотів щодня возитися з CMD та списками імен файлів; Я створив конфігурацію, з якою міг би використовувати умовну компіляцію, щоб поставити манекенні значення командного рядка і перевірити ділову логіку програми, що дало мені набагато швидший цикл ітерації на розвиток програми.
Брайан S

9

Переважно, налагодження включає багато додаткової інформації, корисної при налагодженні. У режимі випуску це все скорочення та торгується для продуктивності.


1) Що з наступних питань? У проекті ASP.NET MVC є 3 конфігури: база (web), налагодження (web.debug), реліз (web.release). Припустимо, що ми встановлюємо налагодження та звільняємо рядок з'єднання шляхом перетворення у відповідний конфігурацію (налагодження та випуск). Під час публікації ми можемо публікувати згідно з нашим вибором у діалоговому вікні публікації. Але при запуску програми, не дивлячись на те, що я вибираю «Налагодження», він використовує конфігурацію випуску (тому що я встановлюю конфігурацію налагодження в базі та конфігурації налагодження), це нормально?
Джейсон

2) Під час запуску програми в режимі налагодження або випуску використовує VS базове веб-конфігурацію або відповідну веб-конфігурацію (web.debug.confg або web.release.config)?
Джейсон

7

Якщо ви переглянете варіанти компіляції проектів і порівняєте їх, ви побачите, у чому полягають відмінності.

Припустимо, що питання стосується нативного / C ++ коду (це не зовсім зрозуміло з фразоутворення):

В основному, у налагодженні всі оптимізації генерації коду вимкнено. У деяких бібліотеках (наприклад, STL ) за замовчуванням відбувається більш сувора перевірка помилок (наприклад, ітератори налагодження). Створюється більше інформації про налагодження (наприклад, для "Редагувати та продовжувати"). У коді генерується більше речей для лову помилок (місцеві значення змінних встановлюються на неініціалізований візерунок, і використовується купа налагодження).


2
@Vilx: коли я піднявся, ще не було тегу .net, а лише visualstudio. Тож я припустив, що це C ++.
NeARAZ

6

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


Але лише для .NET (не C ++)?
Пітер Мортенсен

6

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


"... різко змінити ... власне ділову логіку" - звучить як помилка для мене! У нас багато умовного коду, і це дуже важко зрозуміти. Крім того, кожна комбінація умовних кодів-прапорів є по суті різною версією вашого програмного забезпечення, яку слід перевірити, щоб забезпечити правильність та основну цілісність. Відповідно до "Code Complete", моя Біблія створення програмного забезпечення, наша "Основна директива" - це управління складністю. (Це наша проблема №1 для вирішення). Подумайте довго і наполегливо, перш ніж без розбору додавати більше умовних прапорів!
MicroservicesOnDDD

Мій вище коментар не був спрямований на цю відповідь, зокрема, що стосується останнього речення ... це було лише додатковою справою, яку я вважав, що читачі, які приходять сюди, повинні прочитати.
MicroservicesOnDDD

6

Також зауважте, що при використанні MFC, наприклад, проекти налагодження посилаються на неперерозподілювані версії DLL, наприклад, в MFC90D.DLLтой час, як версія будує посилання проти перерозподілюваних версій, як MFC90.DLL. Це, мабуть, схоже на інші рамки.

Тому ви, ймовірно, не зможете запускати програми налагодження програм на машинах, що не розробляють.


дуже правильно. Побіг цього разу, перебуваючи у клієнта. Працює над моєю машиною (TM).
Метт Якобсен

Ви можете їх розповсюджувати .. (не знайте, чи вам це дозволено). Вони повинні знаходитись у підпапці вашої заявки на належному рівні.
Андреас Рейфф

@Andreas Що стосується мого прикладу, "нерозподіляється" означає, що Microsoft не дозволяє їх розповсюджувати.
foraidt

4

Мене цікавить і це питання, коли я розробив програму, скопійовану з існуючої конфігурації збірки версій.

У мене є розробник, якому цікаво використовувати цю програму в режимі налагодження, тому я задумався, що знадобиться, щоб ця конфігурація збірки, яка існує з іменем ReleaseMyBuild, скопійована з конфігурації Release (і, таким чином, повинна мати всі налаштування, спрямовані на звільнення оптимізацій ) несподівано змінити команди та перетворити налагодження, незважаючи на заплутану назву конфігурації збірки.

Я подумав, що конфігурація проекту - це лише ім'я та зручний спосіб вибору "цілого ряду налаштувань", про який згадує Йоріс Тіммерманс. Я хотів би знати суворі будні тільки те , що ці параметри можуть бути, що вносять конфігураціями збірки з ім'ям функція «Foo» як оптимізований релізом збірка.

Ось один погляд на це. Я створив новий VCXPROJ із порожнього шаблону проекту від Visual Studio 2010. Потім скопіював його та відредагував обидва, перший для збереження вмісту налагодження, а другий вміст випуску. Ось різниця зосереджена на відповідних відмінностях ...

Порожні VCXPROJs Налагодження проти випуску розл

ПОВІДОМЛЕННЯ

<PropertyGroup>
    <WholeProgramOptimization>true</WholeProgramOptimization>

<ClCompile>
    <Optimization>MaxSpeed</Optimization>
    <FunctionLevelLinking>true</FunctionLevelLinking>
    <IntrinsicFunctions>true</IntrinsicFunctions>
<Link>
    <EnableCOMDATFolding>true</EnableCOMDATFolding>
    <OptimizeReferences>true</OptimizeReferences>

НАЛАГОДЖУВАТИ

<PropertyGroup>
    <UseDebugLibraries>true</UseDebugLibraries>`

<ClCompile>
    <Optimization>Disabled</Optimization>

Цікаво, що в розділі Посилання вони обоє GenerateDebugInformationвстановили істину.


3

Очевидна різниця, яку ви можете бачити, - це розмір двійкового файлу. Збірка налагодження створює більший двійковий файл, ніж збірка Release.

Під час компіляції у налагодженні таблиця символів додається до компільованого об’єкта файлу коду, що дозволяє програмам налагодження вписуватись у ці бінарні файли та отримувати доступ до значень об’єктів та змінних.

Ще одна помітна відмінність полягає в тому, що в режимі випуску бінарний файл буде просто збій на фатальну помилку в режимі налагодження. Якщо ви почнете налагодження програми в Visual Studio, ви можете перевірити стек виклику, який повідомляє вам точне місце помилкового твердження .


-15

Я не знаю, в чому полягають точні відмінності, тому що насправді про це легко немає інформації.

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

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


7
Як це відповідає на питання? І будь ласка, зверніть увагу, коли ви набираєте текст.
mmking

У мене була подібна проблема, код працює в режимі налагодження, але в режимі випуску є проблеми. Виявляється, проблема в моєму коді. Є чудова стаття про поширені проблеми у версії випуску. Сподіваємось, це може допомогти і іншим.
Вейхуй Го
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.