Чи слід завжди залишати код налагодження на місці чи додавати його лише під час налагодження та видаляти, коли помилка знайдена?


35

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

Як ти це робиш? Ви залишаєте код налагодження на місці або видаляєте його, коли застаріло (що може бути складно судити, коли це є)?

Відповіді:


30

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


5
+1 Перш за все, щоб згадати про наявність розумної системи налагодження. Якщо це відбувається спочатку, і існують різні рівні налагодження, тоді виробничий код може, сподіваючись, працювати без виклику дорогих процедур налагодження, а код розробки може працювати з будь-яким рівнем ретельного контролю, сподіваємось, увійти будь-яким способом.
Увімкнення

1
Погодьтеся з Орблінгом. І плюс до коду налагодження, окрім виключно відображення інформації, яка мала вплив на продуктивність або іншу причину, непридатну для виробництва. (наприклад, Assert on result of function, наприклад перевірка результату сортування), ви можете розглянути два режими цілі збірки. режим налагодження та режим випуску.
Зекта Чан

16

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

Незалежно від того, чи буде це повне видалення чи розміщення у розділах умовної компіляції (як у C / C ++ / C #), залежить від вас та вашого стандарту кодування.

Для цього є ряд причин:

  1. Можуть бути наслідки для безпеки, якщо цей код виконаний або хтось може отримати доступ до його виводу.
  2. Це може сповільнити програму.
  3. Це може бути заплутаним для інших розробників, які дивляться на код (чи справді ви самі) через 6 місяців вниз.

+1 для умовної компіляції, але блоки коментарів працюватимуть мовами, які їх не підтримують. Ніколи не слід залишати його складеним у випуску prod, але іноді надмірно неефективно продовжувати видаляти його повністю кожного разу, коли ви хочете скинути збірку релізів.
Білл

1
Я працював у середовищах, де C / C ++ код завжди компілювався з параметрами налагодження у випадку, якщо виробничий код потрібно було налагодити або перевірити coredump. Іноді цей завжди готовий до налагодження мандат вимагає, щоб заяви про налагодження залишалися, щоб вони могли бути включені прапором без перекомпіляції коду. Java завжди дозволяє налагоджувати, якщо для вас встановлені ваші параметри JVM, тому для відладки речей потрібно пізніше попередня робота.
Майкл Шопсін

16

ChrisF і Аларік обидва мають дійсні точки; +1 для них. Я можу визначити щонайменше 5 різних типів коду налагодження, який я використовую.

  1. Використання журналів для скидання стану системи в певний момент часу.

    void function(...)
    {
        ...dump everything i know about.
    }
    
  2. Використання журналів для контрольних пунктів виконання.

    void function(...)
    {
        ...got here 1
        ...got here 2
    }
    
  3. Код, який насправді змушує певну умову бути правдою, але порушує нормальну поведінку. Приклад:

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

  5. Журнал операцій - див . Пост Аларіка . Це майже те, що я маю на увазі під «операційним журналом».

1, 2 і 3 слід витягувати повністю. Щось подібне до 4, я, мабуть, умовно скласти з коду. Для 5-ти років Аларік мав велике значення щодо можливості динамічно вимикати журнали. Це, можливо, стосується точки КріС у другій кулі у більшості випадків.


1
Це хороший підсумок. Однак було б краще, якби ви відформатували його належним чином, замінивши 1)… на 1.… (щоб форматування Markdown вибирало його у вигляді списків) і вводили зразок коду на 8 пробілів (знову ж таки, щоб Markdown вибирав його як приклад код у списку).
Конрад Рудольф

@Konrad Rudolph: Готово.
габлін

3

Це залежить від того, що робить код. Деякий код, який використовується для налагодження, можна залишити таким, який він є, а деякий слід видалити.

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

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

Код, який ви додали лише для відстеження конкретної помилки, часто можна видалити після того, як ви знайшли помилку.


2

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

Деякий код налагодження залишився на місці, конкретні речі, які мали надати вкладення дзвінків. Однак, хоча те, що налагодження рядка в основному не було б видно у виробничій системі, все-таки все робилося за умови умовної компіляції.

Однак реальність полягає в тому, що весь цей налагоджувальний код доклав чимало зусиль для того, що ідеально обробляється по-іншому - використовуючи, звичайно, відладчик. На той момент я не був вражений налагоджувачем Borland C ++. Інструменти були там, але вони занадто часто давали оманливі результати, а використання налагоджувача без IDE (часто необхідного) означало запам'ятовування клавіш швидкого доступу, що означало відволікання від роботи.

Єдиний досвід налагодження, який я виявив, що є гіршим, це командний рядок GDB.

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

На той час, коли я працював у Visual Studio 7, проте, було зрозуміло, що налагодження може бути дуже практичним та ефективним. Якщо ви можете виконати налагодження у Visual Studio (включені експрес-видання), налагодження - це вітер. Без сумніву, якщо ви можете знайти правильний інтерфейс GUI / IDE, GDB також простий та ефективний, хоча я ще не робив цього пошуку.

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

Несподівано важливий інструмент = cmake, інструмент побудови, який дозволяє мені легко перемикатися між побудовою для GCC та VC ++, серед іншого. Тож я можу зробити тестування одиниць і покриття на основі gcov за допомогою GCC, але легко перейти на VC ++ для використання налагоджувача.


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

@Pemdas - У мене ще не було серйозної проблеми з цих питань, хоча багатопотокова передача, очевидно, не є налагоджувальною. Незважаючи на це, я думаю, що правильні інструменти, ймовірно, краще рішення, ніж код налагодження в принципі. Засіб статичного аналізу, який може виявити умови перегонів, тупикові місця, умови, коли два потоки можуть битися за один і той же пам'ять / ресурс одночасно тощо, було б непогано. Я не маю уявлення про те, що є в цьому напрямку, хоча я знаю, що там є якісь розумні інструменти. klee, наприклад - я цього не розумію, але основний опис звучить дуже вражаюче.
Стів314

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

Надто залежна від інструментів, яку я ще навіть не досліджувала, здається малоймовірною. На прикладі вашого калькулятора, так, але я все одно буду використовувати OpenOffice Calc, а не писати власну просту електронну таблицю. Настав час для налагодження коду (навіть із налагоджувачем - наприклад, ваш власний випадок, що створює химерні умови), але якщо він виходить за межі певного моменту, наявні інструменти виграють. А якщо мова йде про віднімання 15% від 115, я теж використаю цей калькулятор - те, що багато хто дасть, як очевидну відповідь (100) - невірно. Очевидно, що правильні відповіді сумніваються в тому, що іноді виявляються неправильними.
Steve314

1

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


-1

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


-1

Використовуйте TDD , тому ваш тестовий код завжди має місце, де його навіть підтримують.


як це відповідає на поставлене запитання?
гнат

Тому що TDD приводить вас до "налагодження" або тестового коду, який вам не доведеться видаляти.
dukeofgaming

Мені не шкода. Як у тому, що?
гнат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.