|
| 1 | +# Guía de Troubleshooting de Compilación |
| 2 | + |
| 3 | +Esta guía te ayuda a entender y resolver errores de compilación cuando usas el sistema de autofix. |
| 4 | + |
| 5 | +## 🎯 Sistema de Clasificación de Errores |
| 6 | + |
| 7 | +El módulo de compilación clasifica automáticamente los errores en categorías: |
| 8 | + |
| 9 | +| Tipo | Descripción | Causa | Solución | |
| 10 | +|------|-------------|-------|----------| |
| 11 | +| **config** | Símbolos no declarados | Falta `CONFIG_*` en `.config` | Habilitar flag en configuración | |
| 12 | +| **dependency** | Headers faltantes | Archivo no encontrado | Verificar includes y paths | |
| 13 | +| **code** | Errores de sintaxis/tipos | Bug real en código | Revisar/corregir código | |
| 14 | +| **unknown** | No clasificado | Diversas causas | Análisis manual | |
| 15 | + |
| 16 | +## 🔍 Errores Comunes y Soluciones |
| 17 | + |
| 18 | +### 1. Errores de tipo "config" |
| 19 | + |
| 20 | +**Síntoma:** |
| 21 | +``` |
| 22 | +error: 'envp_init' undeclared (first use in this function) |
| 23 | +error: redefinition of 'rd_load_image' |
| 24 | +``` |
| 25 | + |
| 26 | +**Causa:** |
| 27 | +Estos archivos dependen de configuraciones específicas del kernel (`CONFIG_BLK_DEV_INITRD`, `CONFIG_BLK_DEV_RAM`, etc.) que no están habilitadas en la configuración por defecto. |
| 28 | + |
| 29 | +**Solución:** |
| 30 | + |
| 31 | +#### Opción 1: Configuración manual específica |
| 32 | +```bash |
| 33 | +cd /path/to/kernel/linux |
| 34 | +make menuconfig |
| 35 | +# Habilitar: |
| 36 | +# - Device Drivers → Block devices → RAM block device support |
| 37 | +# - Device Drivers → Block devices → Initial RAM filesystem and RAM disk |
| 38 | +make |
| 39 | +``` |
| 40 | + |
| 41 | +#### Opción 2: Usar una configuración más completa |
| 42 | +```bash |
| 43 | +cd /path/to/kernel/linux |
| 44 | +# En lugar de defconfig, usar la configuración del sistema actual |
| 45 | +zcat /proc/config.gz > .config # Si está disponible |
| 46 | +# O copiar desde /boot |
| 47 | +cp /boot/config-$(uname -r) .config |
| 48 | +make oldconfig |
| 49 | +``` |
| 50 | + |
| 51 | +#### Opción 3: Ignorar archivos específicos |
| 52 | +Si no necesitas compilar estos archivos específicos, puedes filtrarlos: |
| 53 | +```bash |
| 54 | +# Editar tu script para excluir archivos problemáticos |
| 55 | +exclude_files = ['do_mounts_initrd.c', 'do_mounts_rd.c'] |
| 56 | +``` |
| 57 | + |
| 58 | +### 2. Errores de tipo "dependency" |
| 59 | + |
| 60 | +**Síntoma:** |
| 61 | +``` |
| 62 | +fatal error: some_header.h: No such file or directory |
| 63 | +``` |
| 64 | + |
| 65 | +**Solución:** |
| 66 | +```bash |
| 67 | +# Verificar que el kernel esté completamente configurado |
| 68 | +cd /path/to/kernel/linux |
| 69 | +make prepare |
| 70 | +make scripts |
| 71 | +``` |
| 72 | + |
| 73 | +### 3. Errores de tipo "code" |
| 74 | + |
| 75 | +**Síntoma:** |
| 76 | +``` |
| 77 | +error: expected ';' before 'return' |
| 78 | +error: incompatible types when assigning |
| 79 | +``` |
| 80 | + |
| 81 | +**Causa:** |
| 82 | +Estos son errores reales en el código. Pueden ser: |
| 83 | +- Bug del autofix |
| 84 | +- Error preexistente en el kernel |
| 85 | +- Cambio que requiere ajustes adicionales |
| 86 | + |
| 87 | +**Solución:** |
| 88 | +1. Revisar el diff del archivo modificado: |
| 89 | +```bash |
| 90 | +cd /path/to/kernel/linux/init |
| 91 | +diff -u file.c.bak file.c |
| 92 | +``` |
| 93 | + |
| 94 | +2. Si es un bug del autofix, reportarlo o deshabilitar la regla problemática en `engine.py`: |
| 95 | +```python |
| 96 | +# En engine.py, comentar la regla problemática: |
| 97 | +AUTO_FIX_RULES = { |
| 98 | + # "regla problemática": fix_function, # Deshabilitado por bug XYZ |
| 99 | +} |
| 100 | +``` |
| 101 | + |
| 102 | +### 4. Conflictos de sección `__initconst` |
| 103 | + |
| 104 | +**Síntoma:** |
| 105 | +``` |
| 106 | +error: 'initcall_level_names' causes a section type conflict with '__setup_str_set_debug_rodata' |
| 107 | +``` |
| 108 | + |
| 109 | +**Causa:** |
| 110 | +El compilador detecta que dos variables con diferentes cualificadores están en la misma sección. Esto suele ser un problema del kernel original, no del autofix. |
| 111 | + |
| 112 | +**Solución:** |
| 113 | +Este error suele estar presente en el kernel original. Verificar: |
| 114 | +```bash |
| 115 | +# Compilar archivo sin modificaciones del autofix |
| 116 | +cd /path/to/kernel/linux |
| 117 | +git status init/main.c # Verificar si hay cambios |
| 118 | +git checkout init/main.c # Restaurar original |
| 119 | +make init/main.o # Si falla, es un bug del kernel original |
| 120 | +``` |
| 121 | + |
| 122 | +## 🛠️ Auto-configuración del Kernel |
| 123 | + |
| 124 | +El sistema automáticamente ejecuta `make defconfig` si detecta que falta `.config`. Esto: |
| 125 | + |
| 126 | +✅ **Ventajas:** |
| 127 | +- Configuración rápida y automática |
| 128 | +- Permite compilar sin intervención manual |
| 129 | +- Configuración válida y consistente |
| 130 | + |
| 131 | +❌ **Limitaciones:** |
| 132 | +- `defconfig` solo habilita opciones básicas |
| 133 | +- Algunos archivos pueden requerir `CONFIG_*` específicos |
| 134 | +- No es equivalente a una configuración completa del sistema |
| 135 | + |
| 136 | +## 📊 Interpretar el Reporte de Compilación |
| 137 | + |
| 138 | +### Resumen en Consola |
| 139 | +``` |
| 140 | +============================================================ |
| 141 | +RESUMEN DE COMPILACIÓN |
| 142 | +============================================================ |
| 143 | +Total de archivos: 10 |
| 144 | +Compilados con éxito: 7 (70.0%) |
| 145 | +Fallidos: 3 (30.0%) |
| 146 | +Tiempo total: 23.04s |
| 147 | +Tiempo promedio: 2.30s |
| 148 | +============================================================ |
| 149 | +
|
| 150 | +Clasificación de errores: |
| 151 | + • Config/Context (símbolos no declarados por CONFIG_*): 2 |
| 152 | + • Desconocido: 1 |
| 153 | +
|
| 154 | +Archivos con errores de compilación: |
| 155 | + ✗ do_mounts_initrd.c [config] |
| 156 | + init/do_mounts_initrd.c:101:60: error: 'envp_init' undeclared... |
| 157 | +``` |
| 158 | + |
| 159 | +### Interpretación: |
| 160 | +- **70% de éxito** → El autofix no rompe la mayoría del código |
| 161 | +- **2 errores [config]** → Problemas de configuración, no bugs |
| 162 | +- **1 error [unknown]** → Requiere investigación manual |
| 163 | + |
| 164 | +## 🔬 Verificación Avanzada |
| 165 | + |
| 166 | +### Compilar archivo original sin modificaciones |
| 167 | +```bash |
| 168 | +cd /path/to/kernel/linux/init |
| 169 | +# Restaurar original |
| 170 | +cp file.c.bak file.c |
| 171 | +# Compilar |
| 172 | +cd /path/to/kernel/linux |
| 173 | +make init/file.o |
| 174 | +``` |
| 175 | + |
| 176 | +Si el original falla → **no es un bug del autofix** |
| 177 | +Si el original compila pero el modificado falla → **revisar el autofix** |
| 178 | + |
| 179 | +### Inspeccionar diferencias |
| 180 | +```bash |
| 181 | +# Ver exactamente qué cambió |
| 182 | +diff -u init/file.c.bak init/file.c |
| 183 | + |
| 184 | +# Ver con contexto coloreado |
| 185 | +git diff --no-index init/file.c.bak init/file.c |
| 186 | +``` |
| 187 | + |
| 188 | +### Probar fix individual |
| 189 | +```python |
| 190 | +# En Python |
| 191 | +from engine import apply_fixes |
| 192 | + |
| 193 | +issues = [{"line": 100, "message": "WARNING: quoted string split across lines"}] |
| 194 | +results = apply_fixes("/path/to/file.c", issues) |
| 195 | + |
| 196 | +for r in results: |
| 197 | + print(f"Line {r['line']}: {'✓' if r['fixed'] else '✗'} {r['message']}") |
| 198 | +``` |
| 199 | + |
| 200 | +## 📈 Mejores Prácticas |
| 201 | + |
| 202 | +1. **Siempre revisar el reporte de clasificación** antes de asumir que hay un bug |
| 203 | +2. **Verificar archivos originales** antes de reportar problemas |
| 204 | +3. **Usar configuración completa del kernel** para mejor precisión |
| 205 | +4. **Filtrar archivos conflictivos** si no son críticos para tu análisis |
| 206 | +5. **Mantener backups** (el sistema los crea automáticamente como `.bak`) |
| 207 | + |
| 208 | +## 🐛 Reportar Bugs |
| 209 | + |
| 210 | +Si encuentras un error real del autofix, incluye: |
| 211 | + |
| 212 | +1. **Clasificación del error** (output del sistema) |
| 213 | +2. **Diff del archivo** (`diff -u original.c modified.c`) |
| 214 | +3. **Regla que causó el error** (buscar en `engine.py`) |
| 215 | +4. **Contexto del código** (5-10 líneas antes/después) |
| 216 | +5. **Versión del kernel** (si es relevante) |
| 217 | + |
| 218 | +## 🔄 Workflow Recomendado |
| 219 | + |
| 220 | +```bash |
| 221 | +# 1. Analizar |
| 222 | +./run # o ./main.py --analyze ... |
| 223 | + |
| 224 | +# 2. Revisar reporte de compilación |
| 225 | +cat html/compile.html # o consola |
| 226 | + |
| 227 | +# 3. Si hay errores [config]: |
| 228 | +# a) Ignorar (son falsos positivos) |
| 229 | +# b) Configurar kernel manualmente |
| 230 | +# c) Filtrar archivos afectados |
| 231 | + |
| 232 | +# 4. Si hay errores [code]: |
| 233 | +# → Investigar si es bug del autofix |
| 234 | +# → Revisar diff |
| 235 | +# → Deshabilitar regla si es necesario |
| 236 | + |
| 237 | +# 5. Iterar |
| 238 | +# → Deshabilitar fixes problemáticos |
| 239 | +# → Re-ejecutar |
| 240 | +# → Verificar mejora en tasa de éxito |
| 241 | +``` |
| 242 | + |
| 243 | +## 📚 Referencias |
| 244 | + |
| 245 | +- [Kernel Build System](https://www.kernel.org/doc/html/latest/kbuild/index.html) |
| 246 | +- [Kernel Configuration](https://www.kernel.org/doc/html/latest/admin-guide/README.html) |
| 247 | +- [ARCHITECTURE.md](ARCHITECTURE.md) - Arquitectura del sistema |
| 248 | +- [FIXES_STATUS.md](FIXES_STATUS.md) - Estado de reglas de autofix |
0 commit comments