Uno dei miei colleghi mi ha detto ltrace(1)
. Mi ha aiutato molto nella stessa situazione.
assuma il nome dell'oggetto condiviso del C estensione è myext.so
e si desidera eseguire benchmark.py
, quindi
ltrace -x @myext.so -c python benchmark.py
La sua uscita è come è necessario
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
24.88 30.202126 7550531 4 ldap_result
12.46 15.117625 7558812 2 l_ldap_result4
12.41 15.059652 5019884 3 ldap_chase_v3referrals
12.41 15.057678 3764419 4 ldap_new_connection
12.40 15.050310 3762577 4 ldap_int_open_connection
12.39 15.042360 3008472 5 ldap_send_server_request
12.38 15.029055 3757263 4 ldap_connect_to_host
0.05 0.057890 28945 2 ldap_get_option
0.04 0.052182 26091 2 ldap_sasl_bind
0.03 0.030760 30760 1 l_ldap_get_option
0.03 0.030635 30635 1 LDAP_get_option
0.02 0.029960 14980 2 ldap_initialize
0.02 0.027988 27988 1 ldap_int_initialize
0.02 0.026722 26722 1 l_ldap_simple_bind
0.02 0.026386 13193 2 ldap_send_initial_request
0.02 0.025810 12905 2 ldap_int_select
....
Particolare attenzione se l'oggetto condiviso ha -
o +
nel nome del file. Questi caratteri non sono trattati come sono (vedi man ltrace(1)
per i dettagli).
Il jolly *
può essere una soluzione alternativa come -x @myext*
al posto di -x @myext-2.so
.
Grazie mille per questo suggerimento !! In realtà stavo cercando la stessa cosa. Cercherò. – ThR37
EDIT: Funziona perfettamente! Un semplice wrapper con ctypes è OK anche se ottengo a volte segfaults durante il profiling della CPU (ma questo è "normale" e spiegato nel doc ... Sto usando x86_64 :() – ThR37
Grazie mille per questo piccolo nugget. molto, molto utile :-) Quello che sto vedendo è che pprof (o meglio, google-pprof nel pacchetto per Debian), è che non ottengo tutti i simboli sbrecciati come farei quando si profila lo stesso codice con valgrind. Potrebbe essere che ho bisogno di specificare -pg durante la compilazione? – miquelramirez