Яка користь уникнути використання налагоджувача?


101

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

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

Чи можливо керувати комплексом без налагоджувача? Це доцільно? Які переваги можна отримати, використовуючи " психічну налагодження ?"


19
Вітаю, Джонатане, я переглянув ваше запитання, щоб уникнути відладок гніту і тримати питання відкритим: я вважаю - як сказано зараз - це досить гідне, відповідальне питання.

Приклад: Розгляньте код a = 6/3. Замість введення помилки ви ввели a = 6/2.. Тепер ви шукаєте на рівні мнемоніки. Додавання, інструкції JMP, і тоді ви виявите, що була додаткова ітерація замість 2., то ви зрозумієте, що роздільник має неправильний друк. Тепер ви можете зробити висновок, як смішно завжди використовувати налагоджувач.
EAGER_STUDENT

Відповіді:


153

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

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

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

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


27
+1 Я вважаю, що "програмування вгадую" завантаженою фразою. Не існує замінника мислення. Те, що ОП не пояснює, - наскільки ефективно «здогадування». Я сумніваюся, що це суто здогадки (тобто спагетті на підході до стіни), а скоріше використання дедуктивних міркувань. Налагоджувачі мають своє місце, але вони не є панацеєю для дедуктивних міркувань та просто розуміння коду.
Білл

8
@DJClayworth Це не зовсім точно: іноді намагатися використовувати налагоджувач - це поганий вибір, навіть якщо у вас є хороший налагоджувач: у кінцевому підсумку ви витрачаєте багато часу, не витрачаючи багато. Один випадок, який одразу приходить мені в голову, - це вирішення питань паралельності; інші - налагодження рекурсивних алгоритмів з високими коефіцієнтами розгалуження, деякі алгоритми динамічного програмування та апаратні процедури переривання обслуговування. Звичайно, нерозумно не використовувати налагоджувач, коли він вам справді потрібен, але вирішувати, коли вам потрібен налагоджувач - це дуже індивідуальний вибір.
dasblinkenlight

9
+1, хоча мені здається, що налагоджувач неоціненний для певних типів помилок (особливо у складніших алгоритмах), насправді немає заміни просто добре розуміти код
Кріс Браун

7
@DJClayworth я навмисно висловився за сильнішу заяву, ніж "кілька разів, коли краще не використовувати налагоджувач": моя коротка зустріч із конкурентним програмуванням навчила мене, що інстинктивно тягнутися до налагоджувача - це не найефективніша поведінка для мене . У ці дні я починаю з (1) швидкого перечитування коду та (2) вивчення сліду налагодження (якщо є) перед тим, як (3) перейти до налагоджувача. У багатьох випадках третій крок є непотрібним, оскільки я помічаю проблему на етапах (1) або (2), пишу тест одиниці, який відтворює проблему, і кодую виправлення, все без використання налагоджувача.
dasblinkenlight

10
Я думаю, що ти насправді маєш на увазі, що програміст повинен мати послідовність налагодження , а не натискати на магічну кнопку «знайти помилку». Відладчик - надзвичайно потужний інструмент, але ви не підпалюєте бензопилу, щоб обрізати живі огородження.
Спенсер Ратбун

41

Чим більше я знаю базу коду, тим менше мені потрібен налагоджувач (але я все-таки перевіряю повідомлення про помилку, це важлива підказка в будь-яких міркуваннях).

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


35

Вони можуть бути не поганими програмістами, але вони, мабуть, жахливо неефективні.

Я схильний дотримуватися порад від налагодження: 9 неодмінних правил пошуку навіть найбільш невловимих проблем із програмним та апаратним забезпеченням (Девід Аґанс), і ця річ прямо підпадає під керівництвом "Киньте думати і дивіться".


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

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

11
@Mark Bannister - я бачу, що ти кажеш. Дозвольте мені змінити це, якщо ви шукали проблему в коді більше 15 хвилин, відмовтеся від використання налагоджувача і не будьте вперті.
JohnFx

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

1
@mark, якщо ви не працюєте над дуже малою базою коду, я думаю, що неможливо зрозуміти кожен рядок коду. 95% моїх поточних помилок вирішено так, як ви описуєте, але хитріші - там, де вам потрібен налагоджувач.
wobbily_col

31

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

Я працював з розробниками, які відмовляються використовувати налагоджувачі, тому що вони знали краще. Класична відповідь, яку я отримав одного разу: "Збою не спричинено мною. Я весь день перевіряв код [там, де він зазнав аварії], і нічого поганого немає". (А як щодо того нульового значення, яке було прочитане з db?) Бос, здавалося, вважав це чудовою відповіддю, але клієнт цього не зробив.

Я зійшов із цієї команди якнайшвидше. Їх мета полягала в тому, щоб перетворити на роботу і перетворити просту 10-хвилинну проблему в проблему, що займається цілим днем.


18
+1 "Більшість помилок викликані припущеннями" - це дуже мудрі слова
ZJR

15
Я припускаю, що всі помилки викликані припущеннями. (Дивіться, що я там робив? = P)
dan_waterworth

4
@ZJR: Ось чому assertтак здорово. Перевірте свої припущення. Перевіряйте їх часто.
Зан Лінкс

@dan_waterworth: Неправда. Для одного це може бути помилка друку.
Томас Едінг

13

Ваш найкращий посібник щодо налагодження - книга Кодексу Стіва Макконнеля . У розділі 23 докладно розглянуто налагодження, і я перекреслити кілька пунктів з нього.

  1. Розуміння проблеми є важливим, і використання налагоджувача не є її заміною.
  2. Відгадування - це поганий підхід до налагодження. Якщо ваші колеги справді використовують здогадки, а не думають про проблему, значить, вони роблять погану роботу. Відгадування означає вписати у код випадкові друковані висловлювання та сподіватися знайти щось корисне.
  3. Якщо ваші колеги справді не знають, як користуватися налагоджувачем (а не вибирати не використовувати), то так, вони некомпетентні, як і той, хто не знає синтаксису мови, якою він повинен користуватися.

2
Хоча я згоден з вами на більшості вашої посади, я вважаю, що некомпетентність є несправедливою. Можливий розвиток без використання налагоджувача, це просто неефективно. Деякі люди дізнаються про налагоджувачі раніше, ніж інші!
ChrisFletcher

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

2
@MikeDunlavey Чи знає ця людина , як користуватися налагоджувачем і вирішив не використовувати її? Чудово. Якщо вони не знають, я стою біля своєї заяви.
DJClayworth

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

9

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

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

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


8

Я здивований, що в обговоренні на цю тему не згадувалося про «одиничне тестування».

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

  1. Після написання фрагмента коду, щоб переконатися, що він працював і
  2. Коли я отримав повідомлення про помилку, щоб спробувати діагностувати проблему

Що я виявив після 10 років тестового розвитку, це те, що я набагато продуктивніший як програміст, якщо:

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

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

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


+1 Часто швидше додати операцію друку та повторний тест, а потім використовувати відладчик.
Вінстон Еверт

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

7

Особисто я намагаюся мінімізувати використання налагоджувача шляхом:

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

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


6

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


5

Налагодження - це дуже корисний інструмент для перевірки стану об’єктів та змінних у вашому коді під час виконання.

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

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

Можливо, ви очікуєте, що параметр ніколи не буде нульовим при передачі методу, тому ви ніколи не перевіряєте цей випадок і продовжуєте використовувати метод, як ніби цей параметр ніколи не буде нульовим. Реальність така , що параметр буде в кінцевому підсумку нуль в деякій точці , навіть якщо ви встановили в якості попередньої умови для методу, параметр не повинен бути порожнім. Це буде завжди.

На відміну від корисності налагоджувачів у вищезгаданих прикладах, мені здається, що важко і дещо не корисно використовувати, коли задіяно багатоструменеве (тобто одночасність, асинхронна обробка). Це може допомогти, але легко втратити свою орієнтацію в багатопотоковому тумані, коли точки відключення відбивача потрапляють в одну нитку в точці A і зовсім окрему нитку в точці B. Розробник змушений натиснути на нову точку розриву " Мисленнєвий процес "на вершині" стека "мозку і зорієнтується на код у точці нової точки розриву. Після зменшення релевантності точки розриву B потім розробник переходить на першу точку розриву і повинен згадати, на що він / вона шукав перед спусковим механізмом точки межі B. Я знаю, що це може бути заплутаним поясненням,

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

На закінчення, на мою чесну думку:

  • Налагодження при використанні одночасності = підвищена тенденція до втрати уваги "налагоджувальної думки"

і

  • у будь-який інший час = підвищення продуктивності налагодження з / п вашу увагу не переривають несподівані точки прориву (несподівані через перегони).

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

4

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

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

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


4

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

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

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


4

Ем, це залежить від людини. Особисто я настільки не використовую налагоджувачі. Коли я програмую мікроконтролери, я в основному використовую світлодіоди або записую дані в EEPROM, щоб "налагодити" код на ньому. Я не використовую JTAG.

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

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


4

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

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

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


4

Багато відповідей, але не згадка про Heisenbug ?!?!

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

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


3

Нещодавно я читав аргумент проти налагодження налагодження (чи це StackOverflow?). У вас повинні бути тестові справи щодо вашого коду. Якщо ваші тести пройдуть, ваша налагодження, ймовірно, не буде здійснювати помилку (припущення: ви будете налагоджувати дані, аналогічні вашим тестовим даним).

З іншого боку, проведення лісозаготівлі є обов'язковим. Якщо ви здасте свої тести і розгорнете на виробництво, ви можете виявити помилку. Свідчення про помилку - з того, що траплялося в минулому. тобто хтось каже: "Як це потрапило туди?" Якщо у вас немає хороших журналів, ви ніколи не знайдете причину. Навіть налагоджувач може не принести користі в той момент, оскільки ви не знаєте, як виглядали дані, що насправді виявляли помилку. Потрібно мати можливість налагодження програми з журналів.

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


3

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

Останній раз, коли я використовував налагодження, коли я отримав основний файл у якомусь застарілому додатку.

Я є "служником-дебюгером" чи ці хлопці "занадто жорсткі"?

Ні. Вони просто такі люди, хто любить ускладнювати своє життя тоді, як це має бути.


2

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

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

У динамічно набраних мовах без налагодження (навіть якщо це просто скидання значень на консоль) здогадка іноді стає неможливою.

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


2

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

Проблему в цій програмі (на С) було перезапис пам'яті. Відладчик з точкою розриву пам’яті виявив рядовий рядок коду, як тільки з’явилася помилка. Але в цьому випадку немає жодного способу, коли хтось міг би прочитати та зберегти всі 4,5 мільйона рядків коду, щоб визначити одне місце, яке хтось написав повз свій масив (плюс вони повинні були знати компонування пам’яті виконання для стану програми програми ggantuan приблизно 10 хвилин у тривалий проміжок введення, щоб дістати його до цієї точки).

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


0

Якщо помилка виникає на комп'ютері клієнта або на комп’ютері, що його оточення значно відрізняється від вашого, то налаштування налагоджувача / віддаленого налагоджувача є громіздким. Отже, на холодний день, коли ви отримуєте помилку з поля, відповідь "але ... у мене немає налагоджувача" не допомагає. Тому вам потрібно розробити набір навичок для зйомки неполадок та пошуку помилок, лише розуміючи файли коду та журналу.


-1

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

Також врахуйте, що не кожен, хто має завдання налагодження коду, знайомий з цим кодом. Багато разів підрядники потрапляють у середовище, де вони мають лише загальний ідеал того, що відбувається. Вони можуть навіть дати докладний опис оточуючого середовища - або 20-річну схему схеми та посібник до умовних правил іменування (спробуйте зрозуміти різницю між таблицею X1234 та таблицею X4312 з полями F1, F2 та F3 [так, сміття подібне до цього існує], коли ви новачок), але багато разів цей опис неправильний; інакше, чому виникає помилка "таємниці".

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


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