home / skills / victorsmaniotto / degestao / debug-assistant

debug-assistant skill

/.agent/skills/debug-assistant

npx playbooks add skill victorsmaniotto/degestao --skill debug-assistant

Review the files below or copy the command above to add this skill to your agents.

Files (1)
SKILL.md
7.2 KB
---
name: debug-assistant
description: Assistência em debugging e troubleshooting de aplicações PHP/Laravel incluindo análise de stack traces, logs, erros de banco de dados, problemas de performance, memory leaks, e issues de configuração. Usar para diagnosticar erros, interpretar mensagens de exceção, identificar causas raiz, e propor soluções.
---

# Debug Assistant

Skill para diagnóstico e resolução de problemas em aplicações PHP/Laravel.

## Análise de Stack Traces

### Anatomia de um Stack Trace Laravel

```
[2024-01-15 10:30:45] production.ERROR: SQLSTATE[23000]: Integrity constraint violation: 
1062 Duplicate entry '[email protected]' for key 'users.users_email_unique' 
(Connection: mysql, SQL: insert into `users` (`name`, `email`, `password`, `updated_at`, `created_at`) 
values (John, [email protected], $2y$12$xxx, 2024-01-15 10:30:45, 2024-01-15 10:30:45))

#0 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(801): 
   Illuminate\Database\Connection->runQueryCallback()
#1 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Connection.php(567): 
   Illuminate\Database\Connection->run()
#2 /var/www/html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1716): 
   Illuminate\Database\Query\Builder->insert()
#3 /var/www/html/app/Services/UserService.php(45): 
   App\Models\User::create()                    ← PONTO DE ORIGEM
#4 /var/www/html/app/Http/Controllers/UserController.php(28): 
   App\Services\UserService->register()         ← CHAMADOR
```

### Checklist de Análise

```markdown
1. [ ] Identificar tipo do erro (Exception class)
2. [ ] Localizar mensagem principal
3. [ ] Encontrar arquivo/linha de origem (primeiro arquivo app/)
4. [ ] Verificar parâmetros/dados envolvidos
5. [ ] Checar contexto (request, user, etc)
```

## Erros Comuns e Soluções

### Database Errors

```php
// ERRO: SQLSTATE[23000] Duplicate entry
// CAUSA: Violação de unique constraint
// SOLUÇÃO:
try {
    User::create($data);
} catch (\Illuminate\Database\UniqueConstraintViolationException $e) {
    // Laravel 10+
    return back()->withErrors(['email' => 'Email já cadastrado']);
}
// OU usar firstOrCreate/updateOrCreate
User::firstOrCreate(['email' => $email], $data);

// ERRO: SQLSTATE[42S22] Column not found
// CAUSA: Coluna não existe ou typo
// VERIFICAR:
php artisan tinker
>>> Schema::hasColumn('users', 'nome')  // false = coluna não existe
>>> Schema::getColumnListing('users')    // listar colunas

// ERRO: SQLSTATE[HY000] [2002] Connection refused
// CAUSA: MySQL não está rodando ou configuração errada
// VERIFICAR:
// 1. MySQL running: sudo systemctl status mysql
// 2. .env: DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD
// 3. Docker: verificar se container está up e network correta
```

### Class/Method Not Found

```php
// ERRO: Class 'App\Services\UserService' not found
// CAUSA: Autoload desatualizado ou namespace errado
// SOLUÇÃO:
composer dump-autoload
// Verificar namespace no arquivo corresponde ao path

// ERRO: Method App\Models\User::contracts does not exist
// CAUSA: Método não definido ou typo
// VERIFICAR: O método existe no Model? Está usando trait correto?

// ERRO: Target class [UserController] does not exist
// CAUSA: Controller não registrado ou namespace errado em routes
// SOLUÇÃO Laravel 8+:
// routes/web.php
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
```

### Memory/Performance

```php
// ERRO: Allowed memory size of X bytes exhausted
// CAUSA: Loop infinito, query sem limit, processamento em massa
// SOLUÇÕES:

// 1. Chunking para grandes volumes
User::chunk(1000, function ($users) {
    foreach ($users as $user) {
        // processar
    }
});

// 2. Cursor para economia de memória
foreach (User::cursor() as $user) {
    // processar um por vez
}

// 3. Lazy collections
User::lazy()->each(function ($user) {
    // processar
});

// 4. Aumentar limite temporariamente (não recomendado como fix permanente)
ini_set('memory_limit', '512M');
```

### N+1 Query Problem

```php
// PROBLEMA: Query executada para cada item do loop
// SINTOMA: Lentidão, muitas queries no debugbar

// ❌ RUIM - N+1
$contracts = Contract::all();
foreach ($contracts as $contract) {
    echo $contract->client->name; // Query para cada contract!
}

// ✅ BOM - Eager Loading
$contracts = Contract::with('client')->get();
foreach ($contracts as $contract) {
    echo $contract->client->name; // Sem queries adicionais
}

// DETECTAR N+1
// .env
QUERY_LOG=true
// Ou usar Laravel Debugbar / Telescope
```

## Ferramentas de Debug

### Laravel Telescope

```bash
composer require laravel/telescope --dev
php artisan telescope:install
php artisan migrate
# Acessar: /telescope
```

### Laravel Debugbar

```bash
composer require barryvdh/laravel-debugbar --dev
# Automático em ambiente local
```

### Logging Estratégico

```php
use Illuminate\Support\Facades\Log;

// Níveis de log
Log::emergency($message);  // Sistema inutilizável
Log::alert($message);      // Ação imediata necessária
Log::critical($message);   // Condições críticas
Log::error($message);      // Erros
Log::warning($message);    // Avisos
Log::notice($message);     // Eventos normais mas significativos
Log::info($message);       // Informações
Log::debug($message);      // Debug detalhado

// Com contexto
Log::error('Falha no pagamento', [
    'contract_id' => $contract->id,
    'amount' => $amount,
    'gateway_response' => $response,
    'user_id' => auth()->id(),
]);

// Channel específico
Log::channel('payments')->info('Pagamento processado', [...]);
```

### Dump & Die

```php
// Dump e continuar
dump($variable);

// Dump e parar (die)
dd($variable);

// Dump SQL de query
Contract::where('status', 'active')->dd();
// ou
Contract::where('status', 'active')->toSql();

// Com bindings
$query = Contract::where('status', 'active');
dump($query->toSql(), $query->getBindings());
```

## Checklist de Troubleshooting

```markdown
## Erro em Produção
1. [ ] Verificar logs: storage/logs/laravel.log
2. [ ] Verificar .env: APP_DEBUG=false, APP_ENV=production
3. [ ] Cache limpo: php artisan optimize:clear
4. [ ] Permissões: storage/ e bootstrap/cache/ com 775

## Erro de Database
1. [ ] Conexão OK: php artisan db
2. [ ] Migrations rodaram: php artisan migrate:status
3. [ ] Índices existem: SHOW INDEX FROM table_name
4. [ ] Query correta: Log::debug(DB::getQueryLog())

## Erro de Performance
1. [ ] N+1 queries: debugbar ou telescope
2. [ ] Cache ativo: php artisan cache:table
3. [ ] Queue funcionando: php artisan queue:work
4. [ ] Índices no DB: EXPLAIN SELECT...

## Erro de Autenticação
1. [ ] Session driver: config/session.php
2. [ ] Guards configurados: config/auth.php
3. [ ] Middleware aplicado: route:list
4. [ ] Token válido (Sanctum/Passport)
```

## Comandos de Diagnóstico

```bash
# Status geral
php artisan about

# Listar rotas
php artisan route:list --columns=uri,method,action

# Verificar config
php artisan config:show database

# Testar conexão DB
php artisan db

# Verificar migrations
php artisan migrate:status

# Limpar tudo
php artisan optimize:clear

# Logs em tempo real
tail -f storage/logs/laravel.log

# Verificar queue
php artisan queue:monitor redis:default
```