È molto semplice cambiare gprof per eseguire il profiling dell'orologio a muro. Gli unici 8 caratteri per sostituire sono:
ITIMER_PROF -> ITIMER_REAL
SIGPROF -> SIGALRM
nel file glibc/sysdeps/posix/profil.c
, funzionano __profil
, nei pressi delle chiamate a setitimer
e sigaction
(più precisamente __Setitimer
e __sigaction
)
Dopo il cambio qualsiasi programma che utilizza SIGALRM sarà essere rotto e qualsiasi programma che non ha codice di riavvio syscall di blocco può dare risultati errati.
Inoltre, è possibile modificare direttamente i valori int in binario glibc (per favore, non lo fate questo su tutto il sistema libc.so
, fare una copia separata e dare al programma con LD_LIBRARY_PATH)
Per cerotto binario, ITIMER_PROF è 2 ; ITIMER_REAL è 0; SIGPROF è 27 (0x1b); SIGALRM è 14 (0x0e). Ci sono due posizioni per ogni costante nella funzione profil
di glibc.
Un altro modo è scrivere un debugger ptrace, che cambierà gli argomenti delle funzioni setitimer e sigaction in fase di esecuzione.
Probabilmente vuoi qualcosa di diverso da gprof per questo. – WhirlWind
Come cosa ad esempio? – jetwolf
dai un'occhiata a dtrace, a seconda della tua architettura. – WhirlWind