malloc, free, append

This commit is contained in:
2026-10-02 11:36:59 +02:00
parent b8141311aa
commit 9d517f3607
13 changed files with 960 additions and 13 deletions
+31
View File
@@ -32,6 +32,30 @@ Si juntas dos flags de parada (`-E -S`), gana la que para antes.
| `tail -c 5 fichero \| xxd` | Muestra los últimos bytes: sirve para ver si el fichero acaba en `0a` (`\n`). |
| `echo $?` | Código de salida del último comando: `0` es éxito. |
## Memoria
| Comando | Qué hace |
|---|---|
| `valgrind ./build/hello` | Sin `--leak-check`: errores de acceso (`Invalid write`, `Invalid free`) y de dónde viene cada dirección. |
| `valgrind --leak-check=full ./build/hello` | Ejecuta vigilando la memoria: fugas, *use after free*, lecturas sin inicializar. Solo Linux. |
| `cat /proc/self/maps` | Mapa de memoria virtual del proceso: código, `[heap]`, `[stack]`, librerías. Con `<pid>` en vez de `self`, el de otro proceso. |
| `journalctl -k \| grep -i "out of memory"` | Ver si el OOM killer del núcleo ha matado algún proceso. |
| `pgrep -a nombre` | Lista los procesos cuyo nombre contiene `nombre`, con su PID y su línea de comandos. |
| `pgrep -o nombre` | PID del proceso más antiguo con ese nombre (normalmente el principal). |
| `grep -E 'VmSize\|VmRSS' /proc/<pid>/status` | Memoria virtual reservada (`VmSize`) frente a RAM física en uso (`VmRSS`). |
| `grep -E 'heap\|stack' /proc/<pid>/maps` | Rangos de direcciones del montón y de la pila de un proceso. |
| `pmap -x <pid>` | Mapa de memoria con tamaño virtual y residente de cada zona. |
| `ulimit -s` | Tamaño máximo de la pila en KB (8192 = 8 MB). |
| `go build -gcflags=-m` | (Go) Muestra qué variables escapan al montón. |
## Depurar
| Comando | Qué hace |
|---|---|
| `gdb ./build/hello` | Abre el programa en el depurador (hace falta `-g`). |
| `run` / `bt` / `print x` | Dentro de gdb: ejecutar, ver la pila de llamadas, ver una variable. |
| `break f.c:42` / `next` / `step` / `continue` | Dentro de gdb: punto de parada, siguiente línea, entrar en la función, seguir. |
## Solo en Windows (MSYS2)
| Comando | Qué hace |
@@ -61,6 +85,13 @@ Si juntas dos flags de parada (`-E -S`), gana la que para antes.
| `missing separator` | Make | La receta empieza por espacios en vez de tabulador. |
| `'x' is up to date` | Make | No es un error: el objetivo es más nuevo que todos sus prerrequisitos. Si `x` es una acción (`clean`), falta en `.PHONY`. |
| `no newline at end of file` | Clang | El fichero no termina en `\n`. |
| `unknown type name 'uint8_t'` / `identifier ... is undefined` | Compilador / VS Code | Falta el `#include` que declara ese tipo (`<stdint.h>`, `<stddef.h>`...). |
| `makes integer from pointer without a cast` | Compilador | Se pasa una dirección (puntero) donde se espera un número. Por ejemplo, `"A"` en vez de `'A'`. |
| `pointer targets ... differ in signedness` | Compilador | Se mezclan `char *` y `uint8_t *` (`unsigned char *`). |
| `Segmentation fault (core dumped)` (código 139) | Núcleo | Acceso a una dirección no mapeada; casi siempre un puntero `NULL`. Usa gdb. |
| `free(): invalid pointer` / `Aborted` (código 134) | glibc | `free` de algo que no dio `malloc`: dirección de la pila (`&x`), literal, interior de un bloque o *double free*. Usa Valgrind. |
| `comparison of constant -1 with expression of type 'uint8_t' is always false` | Clang / VS Code | Comparas un tipo sin signo con un negativo: nunca puede ser igual. Revisa el tipo. |
| `useless storage class specifier in empty declaration` | Compilador | Un `typedef` sin nombre nuevo al final. |
## Go equivalente