WebMriya
Назад до статей

Техніки дебагу: що це таке і коли яку використовувати

Практична карта основних технік дебагу — від print-дебагу до брейкпоінтів, бісекції й production observability — і чіткий гайд, яка техніка підходить для якого типу багів.

Debugging
Developer Tools
Frontend Architecture
W
Frontend Architecture & Legacy Modernization
9 вересня 2026 р. · 8 хв читання

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

Починайте з відтворення, а не з теорій

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

Основні техніки

ТехнікаНайкраще дляСлабкість
Print / лог-дебагШвидкі перевірки, асинхронні потоки, розподілені системиШумно, потребує здогадок, де дивитися
Брейкпоінти й покроковий дебагСкладна локальна логіка, незнайомі шляхи кодуПовільно, не масштабується на чутливі до часу баги
Бісекція (git bisect)Регресії — «раніше працювало»Потребує надійного відтворення й чистої історії
Гумове каченя / пояснення вголосЛогічні помилки, хибні припущенняНічого не дає для справді невідомої поведінки
Бінарний пошук по обсягуВеликі, незнайомі кодові базиПовільніше за прямий брейкпоінт, коли знаєте, де дивитися
Production observability (трейси, RUM)Баги, що трапляються лише в проді / під навантаженнямПотребує інструментації, налаштованої заздалегідь

Print / лог-дебаг

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

Брейкпоінти й покроковий дебаг

Правильний вибір, коли треба оглянути реальний стан у конкретний момент — неправильні значення у складному обʼєкті або незнайомий шлях коду, який треба пройти рядок за рядком. Умовні брейкпоінти (зупинка лише коли змінна відповідає умові) перетворюють це з грубого інструменту на точний для багів, похованих у циклах чи високочастотних викликах.

Бісекція: знайти, коли зламалося

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

Дебаг «гумовим каченям»

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

Production observability

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

Гайд для вибору техніки

  1. Чи можете надійно відтворити баг? Якщо ні — спершу додайте логування/observability: усі інші техніки припускають, що ви можете викликати баг на вимогу.
  2. Раніше працювало? Зробіть бісекцію, щоб знайти точну зміну, а потім дебажте саме цей diff, а не всю кодову базу.
  3. Це локальна логічна помилка в коді, який ви розумієте? Спробуйте пояснити вголос до того, як брати дебагер — часто це швидше.
  4. Незнайомий код або важливий стан? Використовуйте брейкпоінти, ідеально — умовні, привʼязані до умови збою.
  5. Трапляється лише в production? Спершу інструментуйте — трейси й структуровані логи, а не дебагер, єдині інструменти, що туди дістають.

Підсумок

Немає єдиної «найкращої» техніки — навичка в тому, щоб підбирати техніку під форму бага: відтворюваність, чи це регресія, і чи трапляється лише в масштабі. Саме цей систематичний інстинкт — звужувати корінну причину замість здогадок — ми застосовуємо в кожній виділеній команді, особливо в модернізації legacy, де «чому» за старою поведінкою рідко задокументовано.

Поширені запитання

Який найшвидший спосіб дебажити баг, що трапляється лише в проді?

Інструментація, налаштована до того, як баг трапиться: структуроване логування з correlation ID, розподілений трейсинг і моніторинг реальних користувачів. Баги, що трапляються лише під реальним production-трафіком чи даними, зазвичай не відтворюються локально, тож дебагер — не той інструмент; саме дані observability реально звужують причину.

Чи print-дебаг непрофесійний порівняно з реальним дебагером?

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

Коли варто брати git bisect замість прямого дебагу?

Щойно ви знаєте, що код раніше працював, а зараз ні, і у вас є (або можна написати) надійну перевірку «цей коміт хороший чи поганий». Бісекція перетворює відкритий пошук по історії на приблизно log2(n) кроків, що майже завжди швидше за ручний дебаг незнайомого diff.