Bug Finder и отладка в Cursor | Глава 7

18 октября 2025
64

Глава 7. Bug Finder и отладка

7.1. Автоматическое обнаружение ошибок

Cursor использует AI для проактивного обнаружения потенциальных проблем в коде еще до запуска приложения.

Типы обнаруживаемых проблем

1. Синтаксические ошибки

Базовый уровень — опечатки и синтаксические проблемы:


function calculateTotal(items {  // ← отсутствует закрывающая скобка

return items.reduce((sum, item) => sum + item.price, 0)
} // ← отсутствует точка с запятой (если строгий режим)

Cursor подчеркнет ошибки красной волнистой линией.

2. Логические ошибки

Более сложные проблемы в логике:


function isAdult(age) {

return age > 18; // Должно быть >= 18
}

AI предупредит: "Граничное условие может быть некорректным. Возраст 18 считается совершеннолетним?"

3. Проблемы с типами (TypeScript)


function greet(name: string): string {

return `Hello, ${name}`;
}

greet(123); // Ошибка типа

4. Null/undefined проблемы


function getUserName(user) {

return user.profile.name; // user или user.profile могут быть null/undefined
}

AI предложит:


function getUserName(user) {

return user?.profile?.name ?? 'Unknown';
}

5. Memory leaks и performance issues


useEffect(() => {

const interval = setInterval(() => {
fetchData();
}, 1000);
// Отсутствует cleanup - memory leak!
});

AI предупредит и предложит исправление:


useEffect(() => {

const interval = setInterval(() => {
fetchData();
}, 1000);

return () => clearInterval(interval); // Cleanup
}, []);

6. Security vulnerabilities


app.get('/user/:id', (req, res) => {

const query = `SELECT * FROM users WHERE id = ${req.params.id}`;
// SQL Injection vulnerability!
db.query(query);
});

AI предупредит о SQL injection и предложит параметризованный запрос:


app.get('/user/:id', (req, res) => {

const query = 'SELECT * FROM users WHERE id = ?';
db.query(query, [req.params.id]);
});

7.2. Анализ кода в реальном времени

Cursor анализирует код по мере написания, предоставляя мгновенную обратную связь.

Индикаторы проблем

  •  Красная волна: Критические ошибки (код не скомпилируется/не запустится)
  •  Желтая волна: Предупреждения (код работает, но есть проблемы)
  • Синяя волна: Информационные подсказки (улучшения и оптимизации)

Hover для деталей

Наведите курсор на подчеркнутый код:


┌─────────────────────────────────────────┐
│ Warning                                 │
│ Variable 'data' is used before being    │
│ defined or assigned.                    │
│                                         │
│ Quick Fix:                              │
│ • Initialize variable                   │
│ • Move declaration before usage         │
└─────────────────────────────────────────┘

Problems Panel

View → Problems (Cmd/Ctrl + Shift + M) открывает панель со всеми проблемами в проекте:


PROBLEMS
├─ Errors (3)
│  ├─ server.js:45 - Undefined variable 'app'
│  ├─ utils.js:12 - Missing return statement
│  └─ api.js:78 - Cannot find module 'axios'
├─ Warnings (7)
│  ├─ UserProfile.jsx:23 - Unused variable 'setLoading'
│  └─ ...
└─ Info (12)
   └─ ...

Contextual Analysis

AI понимает контекст проекта:


// В React компоненте

function MyComponent() {
const [count, setCount] = useState(0);

// AI предупредит об отсутствии зависимостей
useEffect(() => {
console.log(count);
}); // Missing dependency: 'count'
}

7.3. Предложения по исправлению

Cursor не только находит проблемы, но и предлагает конкретные исправления.

Quick Fixes

Нажмите на лампочку или Cmd/Ctrl + . на проблемном коде:


const result = data.map(item => item.value);

// 'data' may be undefined

Quick Fixes:
1. Add optional chaining: data?.map(...)
2. Add null check: if (data) { ... }
3. Provide default value: (data || []).map(...)

AI-powered исправления

Для более сложных проблем можно спросить AI:


Выделите проблемный код → Cmd/Ctrl + L

You: Почему этот код не работает?

AI: Проблема в асинхронном выполнении. Вы используете
forEach который не ждёт async функции. Используйте
for...of или Promise.all:

[Показывает исправленный код]

Batch Fixes

Для множественных однотипных проблем:


Problems Panel → Right click → "Fix all in file"

Например, автоматически добавить все отсутствующие импорты или исправить все проблемы с отступами.

7.4. Интеграция с отладчиком

Cursor интегрируется со стандартными отладчиками для различных языков.

JavaScript/Node.js Debugging

Запуск отладки:

  1. Установите breakpoint (клик на номер строки)
  2. F5 или Run → Start Debugging
  3. Выберите конфигурацию (Node.js, Chrome, etc.)

Debug Console с AI

В процессе отладки можно использовать Chat:


You: Почему переменная user здесь undefined?

AI: [Анализирует call stack и переменные]
Проблема: функция getUserData вызывается до завершения
асинхронной загрузки. Добавьте await перед вызовом.

AI-анализ stack trace

Когда приложение падает с ошибкой:


Error: Cannot read property 'name' of undefined
    at getUserName (utils.js:45)
    at processUser (service.js:123)
    at async handler (routes.js:67)

Скопируйте в Chat:


You: [вставьте stack trace]

AI: Анализ показывает:
1. В utils.js:45 ожидается объект user, но получен undefined
2. Проблема возникает в processUser который не проверяет
   валидность пользователя
3. Решение: добавить проверку в processUser:
   
   if (!user) {
     throw new Error('Invalid user object');
   }

Conditional Breakpoints с AI помощью

Вы можете попросить AI сгенерировать сложные условия для breakpoints:


You: Создай условие для breakpoint которое срабатывает только
когда user.role === 'admin' и operation === 'delete'

AI: user?.role === 'admin' && operation === 'delete'

7.5. Профилактика проблем

AI помогает предотвращать проблемы еще на этапе написания кода.

Code Review по мере написания

Cursor автоматически проверяет код на:

  • Best practices нарушения
  • Потенциальные баги
  • Performance антипаттерны
  • Security уязвимости

Пример: Performance


function findUser(users, id) {

// Performance warning
return users.filter(u => u.id === id)[0];
}

AI предупредит:


Filter создаёт новый массив, проходя все элементы.
Используйте find() вместо filter()[0]:

return users.find(u => u.id === id);

Пример: Security


// Storing password in plain text

const user = {
username: 'john',
password: req.body.password // Security risk!
};

AI предупредит:


Пароли не должны храниться в открытом виде.
Используйте хеширование:

const hashedPassword = await bcrypt.hash(req.body.password, 10);
const user = {
  username: 'john',
  password: hashedPassword
};

Linting с AI-объяснениями

Cursor может объяснить любое правило ESLint/Prettier:


const unused = 123;  // ESLint: no-unused-vars


Hover → Ask AI: "Почему это проблема и как исправить?"

AI: Неиспользуемые переменные:
- Загрязняют namespace
- Снижают читаемость
- Могут указывать на недописанный код

Решения:
1. Удалите если не используется
2. Префикс _ если намеренно не используется: const _unused = 123
3. Используйте переменную в коде

Preventive Refactoring

AI может предложить рефакторинг до возникновения проблем:


function processData(data) {

if (data && data.length > 0) {
if (data[0].type === 'user') {
if (data[0].verified) {
// Глубокая вложенность
return data[0].profile;
}
}
}
return null;
}

AI предложит:


Код имеет глубокую вложенность (код smell).
Рефакторинг с ранними возвратами:

function processData(data) {
  if (!data?.length) return null;
  
  const firstItem = data[0];
  if (firstItem.type !== 'user') return null;
  if (!firstItem.verified) return null;
  
  return firstItem.profile;
}