Глава 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
Запуск отладки:
- Установите breakpoint (клик на номер строки)
- F5 или Run → Start Debugging
- Выберите конфигурацию (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;
}