Какие есть способы отладки приложений и в каких случаях вы их используете?nodejs-31

Основные методы отладки

1. Консольный вывод

console.log('Basic debug:', variable);
console.dir(object, { depth: null, colors: true });
console.trace('Trace call stack');

Когда использовать:

  • Быстрая проверка значений
  • Простые сценарии отладки
  • Начальные этапы исследования проблемы

Плюсы: Простота, не требует дополнительных инструментов
Минусы: Загрязнение кода, необходимость ручной очистки

2. Встроенный отладчик Node.js

node inspect server.js

или с chrome devtools:

node --inspect server.js

Когда использовать:

  • Сложные асинхронные сценарии
  • Анализ выполнения по шагам
  • Просмотр контекста выполнения

Плюсы: Полноценный debugger, точки останова
Минусы: Требует остановки приложения

3. Логирование

const logger = require('winston');
logger.error('Error occurred', { error, metadata });

Когда использовать:

  • Продакшен окружение
  • Долгосрочный мониторинг
  • Анализ инцидентов postmortem

Плюсы: Структурированные логи, ротация
Минусы: Настройка форматов, хранилища

4. Профилирование и мониторинг

node --prof server.js
node --cpu-prof server.js

Инструменты:

  • Clinic.js
  • 0x
  • Chrome DevTools Performance tab

Когда использовать:

  • Оптимизация производительности
  • Анализ узких мест
  • Memory leaks detection

5. APM системы

require('newrelic');
// Автоматическое отслеживание

Когда использовать:

  • Крупные распределенные системы
  • Продакшен мониторинг
  • Анализ транзакций

6. Тестирование

test('should handle error', async () => {
  await expect(problematicFunction()).rejects.toThrow();
});

Когда использовать:

  • Предотвращение регрессий
  • Изолированная отладка компонентов
  • TDD подход

Специфичные сценарии отладки

Отладка асинхронного кода

async function problematic() {
  await step1();
  debugger; // Сработает в асинхронном контексте
  await step2();
}

Отладка потоков

const { Worker, isMainThread } = require('worker_threads');

if (isMainThread) {
  new Worker(__filename, {
    workerData: { debugPort: 9229 }
  });
} else {
  debugger; // Отладка воркера
}

Отладка memory leaks

node --inspect --trace-gc server.js
  • Chrome Memory tab

Интеграция с IDE

  1. VS Code:

    • Встроенный debugger
    • Launch configurations
    • Интеграция с Jest
  2. WebStorm:

    • Визуальный отладчик
    • Асинхронные стеки вызовов
    • Интеграция с профайлерами

Продвинутые техники

Условные точки останова

for (let i = 0; i < data.length; i++) {
  if (data[i].error) debugger; // Только при ошибках
}

Динамический инспектинг

const util = require('util');
function debugInspect(obj) {
  return util.inspect(obj, { depth: null, colors: true });
}

Трассировка распределенных систем

const { v4: uuidv4 } = require('uuid');
const correlationId = uuidv4();
// Передавать между микросервисами

Резюмируем

  1. Для быстрой проверки: console.log, console.trace
  2. Для глубокого анализа: Встроенный debugger, Chrome DevTools
  3. Для продакшена: Структурированные логи + APM
  4. Для производительности: Профайлеры (Clinic.js, 0x)
  5. Для предотвращения ошибок: Тесты
  6. Сложные сценарии:
    • Асинхронный код: async/await с debugger
    • Потоки: отдельные сессии отладки
    • Memory leaks: --trace-gc + heap snapshots

Выбор метода зависит от:

  • Сложности проблемы
  • Стадии разработки
  • Требований к производительности
  • Распределенности системы