Uno de mis colegas me dijo ltrace(1)
. Me ayudó bastante en la misma situación.
Asumir el nombre del objeto compartido de su extensión C es myext.so
y desea ejecutar benchmark.py
, entonces
ltrace -x @myext.so -c python benchmark.py
Su salida es como se necesita
% 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
....
especial cuidado si su objeto compartido tiene -
o +
en su nombre de archivo. Estos caracteres no se tratan como están (ver man ltrace(1)
para más detalles).
El comodín *
puede ser una solución como -x @myext*
en lugar de -x @myext-2.so
.
¡Muchas gracias por esa pista! En realidad estaba buscando lo mismo. Intentaré. – ThR37
EDITAR: ¡Funciona perfectamente! Un simple contenedor con ctypes está bien, incluso si obtengo segfaults a veces durante el perfil de la CPU (pero esto es "normal" y se explica en el documento ... Estoy usando x86_64 :() – ThR37
Muchas gracias por esta pequeña pepita. muy, muy útil :-) Lo que estoy viendo es que pprof (o más bien, google-pprof en el paquete para Debian), es que no obtengo tantos símbolos exigidos como lo haría cuando perfilé el mismo código con valgrind. ¿Será que necesito especificar -pg al compilar? – miquelramirez