Pregunta

Voy a implementar un generador de perfiles interno para la memoria en Linux. Quiero guardar la pila para cada malloc / free / realloc. Estoy tratando de usar "pstack" para obtener el seguimiento de la pila cada vez. Pero la sobrecarga es demasiado alta. ¿Hay algún enfoque ligero para obtener la pila de llamadas en código C?

Sé que hay algunas herramientas como "valgrind, google profiler", pero no sé cómo recuerdan las pilas para cada acción.

Cualquier comentario es apreciado.

Gracias.

¿Fue útil?

Solución

Puede hacer su propia función para llamar a la persona que llama:

static inline void *get_caller(void) {
    unsigned long *ebp;

    /* WARNING: This is working only with frame pointers */
    asm ("movl %%ebp, %0" : "=r" (ebp) : );
    ebp = (unsigned long*)*ebp;
    ebp = (unsigned long*)*(ebp+1);
    return ebp;
}

void *malloc(void) {
    void *caller = get_caller();
    ...    
}

" ebp = (unsigned long *) * ebp; " te hará pasar por la pila (si necesitas más de ese rastro de pila).

Otros consejos

Hay una función GNU backtrace () que es relativamente rápida, solo devuelve una matriz de direcciones.

Para resolver estas direcciones a nombres de funciones, debe usar backtrace_symbols () , que es mucho más pesado, pero espero que no necesite ejecutarlo con demasiada frecuencia.

Para obtener backtrace_symbols () realmente resuelve los nombres que necesita para usar las opciones de enlace -rdynamic .

Vea man backtrace para más detalles.

Tenga cuidado con las recursiones con backtrace_symbols (), que llama al propio malloc.

También tenga en cuenta que en el primer uso de backtrace () y amigos, el enlazador dinámico intentará cargar libgcc, que invocará nuevamente a malloc.

Gilad

Ahora encuentro un problema en 64 bits.

En 64 bits, RBP no se mantiene estrictamente. Por ejemplo, gcc -O3 usará RBP como un registro guardado de llamadas normales. Entonces, en este caso, obtener pilas de llamadas de punteros de marco no funciona. :(

¿Algún comentario?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top