Strategiczne logowanie
AI umieszcza optymalne logi debugowania automatycznie
Przekształć debugowanie z godzin frustracji w minuty systematycznego rozwiązywania problemów. Naucz się przepływów debugowania wspomaganych przez AI, które pomagają identyfikować, izolować i naprawiać błędy szybciej niż kiedykolwiek wcześniej.
Tradycyjne debugowanie to często:
Debugowanie wspomagane przez AI to:
Wpływ: Zmniejsz czas debugowania o 40-70% znajdując przyczyny źródłowe bardziej niezawodnie.
Strategiczne logowanie
AI umieszcza optymalne logi debugowania automatycznie
Analiza przyczyn źródłowych
Systematyczne podejście do znajdowania źródeł błędów
Rozpoznawanie wzorców
AI identyfikuje podobne błędy i rozwiązania
Walidacja poprawek
Upewnij się, że poprawki nie wprowadzają nowych błędów
Opisz symptom
Błąd: Uwierzytelnianie użytkownika czasami nie działaError: "Token validation failed"Częstotliwość: ~30% prób logowaniaNie zidentyfikowano jasnego wzorca
Pozwól AI dodać strategiczne logi
// Prompt do Cursora@file auth/login.js@file auth/token.js
Dodaj logowanie debugowania do śledzenia przepływu uwierzytelniania.Skup się na:- Generowaniu i walidacji tokenów- Problemach z timing- Zmianach stanu- Wywołaniach zewnętrznych API
AI generuje ukierunkowane logowanie
// AI dodaje strategiczne console.logasync function validateToken(token) { console.log('[AUTH] Rozpoczynam walidację tokenu', { tokenLength: token?.length, timestamp: Date.now(), tokenPrefix: token?.substring(0, 10) });
try { console.log('[AUTH] Dekoduję token...'); const decoded = jwt.verify(token, SECRET); console.log('[AUTH] Token zdekodowany pomyślnie', { userId: decoded.userId, exp: decoded.exp, timeUntilExpiry: decoded.exp - Date.now() });
// Więcej strategicznych logów... } catch (error) { console.error('[AUTH] Walidacja tokenu nie powiodła się', { error: error.message, token: token?.substring(0, 20), stack: error.stack }); }}
Uruchom i zbierz logi
# Użyj trybu YOLO do automatycznego uruchomienianpm test -- --grep "authentication"# lubnpm run dev > debug.log 2>&1
Analizuj z AI
@file debug.log
Przeanalizuj te logi i zidentyfikuj:1. Przyczynę źródłową przerywanej pracy2. Wszelkie wzorce w błędach3. Sugerowane poprawki
## Szablon badania błędów
### 1. Dokumentacja symptomów- **Co się dzieje**: [Dokładne zachowanie]- **Oczekiwane zachowanie**: [Co powinno się dziać]- **Komunikaty błędów**: [Skopiuj dokładne błędy]- **Kroki do reprodukcji**: [Minimalne kroki]
### 2. Zbieranie kontekstu@file [lokalizacja błędu]@code [konkretna funkcja]@recent-changes@linter-errors
### 3. Prośba o analizę AINa podstawie powyższego kontekstu:1. Jakie są najbardziej prawdopodobne przyczyny?2. Jakie dodatkowe informacje by pomogły?3. Zasugeruj kod diagnostyczny do dodania
// Krok 1: Poproś AI o dodanie profilowania pamięci/** * @cursor Dodaj wykrywanie wycieku pamięci: * - Snapshoty heap w odstępach * - Śledzenie alokacji obiektów * - Liczenie event listenerów * - Logowanie użycia pamięci */
// AI generuje:const heapUsed = process.memoryUsage().heapUsed;console.log(`Pamięć: ${Math.round(heapUsed / 1024 / 1024)}MB`);
// Śledź liczbę obiektówconst objectCounts = {};setInterval(() => { const snapshot = {}; // AI dodaje zaawansowane śledzenie}, 5000);
// Krok 1: Poproś AI o wykrywanie wycieków specyficznych dla React/** * @cursor Dodaj wykrywanie wycieków pamięci React: * - Śledź mount/unmount komponentów * - Monitoruj czyszczenie efektów * - Sprawdź usuwanie event listenerów * - Wykryj wycieki subskrypcji */
// AI generuje:useEffect(() => { console.log(`[LEAK-CHECK] ${componentName} zamontowany`); const activeSubscriptions = [];
// Śledź wszystkie subskrypcje const originalSubscribe = EventEmitter.prototype.on; EventEmitter.prototype.on = function(...args) { activeSubscriptions.push({ event: args[0], listener: args[1], stack: new Error().stack }); return originalSubscribe.apply(this, args); };
return () => { console.log(`[LEAK-CHECK] ${componentName} odmontowywany`, { activeSubscriptions: activeSubscriptions.length }); };}, []);
# Krok 1: Użyj AI do stworzenia skryptu git bisect@cursor Stwórz skrypt który:1. Używa git bisect do znalezienia kiedy błąd został wprowadzony2. Automatycznie uruchamia nasz test3. Identyfikuje łamiący commit
# AI generuje:#!/bin/bash# bisect-bug.sh
echo "Rozpoczynam automatyczny git bisect..."
# Zdefiniuj komendę testowątest_command="npm test -- --grep 'user authentication'"
# Rozpocznij bisectgit bisect startgit bisect bad HEADgit bisect good v1.2.0 # Ostatnia znana dobra wersja
# Uruchom automatyczny bisectgit bisect run bash -c "$test_command && echo 'good' || echo 'bad'"
# Pobierz wynikbreaking_commit=$(git bisect view --oneline -1)echo "Błąd wprowadzony w: $breaking_commit"
# Resetujgit bisect reset
@git commit [breaking_commit_hash]@file [changed_files_in_commit]
Przeanalizuj ten commit i wyjaśnij:1. Co zmieniło się, co mogło spowodować [opis błędu]2. Dlaczego ta zmiana łamie [funkcję]3. Zasugeruj poprawkę zachowującą intencję
// Poproś AI o dodanie debugowania Redux/** * @cursor Dodaj kompleksowe debugowanie Redux: * - Loguj wszystkie akcje z payload * - Śledź zmiany stanu * - Identyfikuj który komponent wywołał akcje * - Wykryj mutacje stanu */
// AI tworzy middleware:const debugMiddleware = store => next => action => { console.group(`[REDUX] ${action.type}`); console.log('Payload:', action.payload); console.log('Poprzedni stan:', store.getState()); console.log('Wywołane przez:', new Error().stack.split('\n')[7]);
const result = next(action);
console.log('Nowy stan:', store.getState()); console.groupEnd();
return result;};
// Debuguj problemy z React Context/** * @cursor Stwórz debugger Context który: * - Śledzi wszystkie aktualizacje kontekstu * - Pokazuje który komponent wywołał aktualizacje * - Identyfikuje niepotrzebne re-rendery * - Loguje zmiany wartości kontekstu */
// AI generuje:export const DebugProvider = ({ children, name }) => { const [value, setValue] = useState(initialValue); const updateCount = useRef(0);
const debugSetValue = useCallback((newValue) => { updateCount.current++; console.log(`[CONTEXT-${name}] Aktualizacja #${updateCount.current}`, { from: value, to: newValue, triggeredBy: new Error().stack, timestamp: Date.now() }); setValue(newValue); }, [value, name]);
return ( <Context.Provider value={{ value, setValue: debugSetValue }}> {children} </Context.Provider> );};
// Krok 1: Poproś AI o dodanie śledzenia wydajności/** * @cursor Dodaj profilowanie wydajności do identyfikacji wąskich gardeł: * - Czas wykonywania funkcji * - Czas trwania zapytań do bazy danych * - Opóźnienie wywołań API * - Wydajność renderowania * - Alokacja pamięci */
// AI generuje kompleksowe profilowanie:const performanceTracker = { marks: new Map(),
start(label) { this.marks.set(label, { start: performance.now(), memory: process.memoryUsage().heapUsed }); },
end(label) { const mark = this.marks.get(label); if (!mark) return;
const duration = performance.now() - mark.start; const memoryDelta = process.memoryUsage().heapUsed - mark.memory;
console.log(`[PERF] ${label}`, { duration: `${duration.toFixed(2)}ms`, memory: `${(memoryDelta / 1024).toFixed(2)}KB`, slow: duration > 100 });
if (duration > 100) { console.warn(`[PERF] Wykryto wolną operację: ${label}`); } }};
// Użycie w kodzieperformanceTracker.start('database-query');const results = await db.query(sql);performanceTracker.end('database-query');
# Przy problemach z przetwarzaniem danych@cursor Pomóż mi zaimplementować debugowanie wyszukiwaniem binarnym:
1. Błąd występuje przy przetwarzaniu dużych zbiorów danych2. Działa dobrze z małymi danymi (< 100 elementów)3. Nie działa z dużymi danymi (> 10000 elementów)
Stwórz podejście wyszukiwania binarnego do znalezienia dokładnego rozmiaru danychgdzie zaczyna nie działać.
// Porównaj działające vs zepsute scenariusze/** * @cursor Stwórz debugger porównujący: * * Scenariusz działający: Użytkownik A może się zalogować * Scenariusz zepsuty: Użytkownik B nie może się zalogować * * Dodaj logowanie które przechwytuje i porównuje: * - Wszystkie parametry funkcji * - Wartości zwracane * - Stan w każdym kroku * - Różnice w czasie * * Wyprowadź diff pokazujący gdzie ścieżki się rozchodzą */
// Śledzenie historii stanu/** * @cursor Stwórz debugowanie podróży w czasie dla naszej aplikacji: * - Przechowuj ostatnie 50 zmian stanu * - Pozwól na odtworzenie przejść stanu * - Identyfikuj które przejście spowodowało błąd * - Eksportuj historię stanu do analizy */
const stateHistory = { states: [], maxHistory: 50,
record(state, action) { this.states.push({ state: JSON.parse(JSON.stringify(state)), action, timestamp: Date.now(), stack: new Error().stack });
if (this.states.length > this.maxHistory) { this.states.shift(); } },
replay(fromIndex = 0) { // Odtwórz przejścia stanu },
export() { // Eksportuj do analizy }};
#!/bin/bash# auto-debug.sh - Automatyzacja debugowania wspomagana przez AI
echo "🔍 Rozpoczynam sesję debugowania wspomaganą przez AI..."
# Krok 1: Zbierz informacje o błędachecho "📝 Zbieranie logów błędów..."npm test 2>&1 | tee test-output.log
# Krok 2: Otwórz logi w Cursorze do analizy AIecho "🤖 Otwieranie w Cursorze do analizy..."cursor test-output.log
# Krok 3: Użyj AI Cursora do analizy i naprawy# W Cursorze możesz:# - Użyć @test-output.log do referencji logu błędów# - Poprosić AI o analizę błędów i sugestie poprawek# - Użyć AI do wygenerowania poprawek dla zidentyfikowanych problemów
# Krok 4: Uruchom weryfikacjęecho "✅ Weryfikacja poprawek..."npm test
echo "📊 Sesja debugowania zakończona!"
Metryka | Tradycyjne | Wspomagane przez AI | Poprawa |
---|---|---|---|
Średni czas naprawy błędu | 4.5 godziny | 1.2 godziny | 73% szybciej |
Dokładność przyczyny źródłowej | 60% | 95% | 58% lepiej |
Wskaźnik regresji | 15% | 3% | 80% mniej |
Frustracja developera | Wysoka | Niska | Bezcenne |
Opanuj przepływy debugowania aby:
Kontynuuj z:
Pamiętaj: Najlepszy debugger to ten, który pomaga zrozumieć nie tylko co jest zepsute, ale dlaczego się zepsuło i jak zapobiec powtórnemu zepsuciu.