2011-06-02 7 views
14

Estoy tratando de usar sprof para perfilar algún software (ossim) donde casi todo el código está en una biblioteca compartida. He generado un archivo de perfiles, pero cuando corro sprof, me sale el siguiente error:¿Qué está causando que sprof se queje de "inconsistencia detectada por ld.so"?

> sprof /home/eca7215/usr/lib/libossim.so.1 libossim.so.1.profile -p > log 
Inconsistency detected by ld.so: dl-open.c: 612: _dl_open: Assertion `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed! 

Las instrucciones que estaba siguiendo dicho que necesitaba versión de libc de al menos 2,5 a 34, tengo la versión 2.12 libc. 2 (Gentoo, kernel 2.6.36-r5).

No puedo encontrar ninguna explicación sobre lo que significa el error o (más interesante) cómo solucionarlo, los únicos resultados de google medio relevantes son para un error en una versión anterior de Skype.

+2

Por lo que puedo decir, es un error en glibc, aparece si googleas RT_CONSISTENT y miras todas las entradas de redhat bugzilla. Estoy usando Oprofile en cambio ahora. – MattSmith

+0

No sé si funciona, pero hay alguna información en esta respuesta sobre el uso de sprof para archivos .so: http://stackoverflow.com/questions/1838989/gprof-how-to-generate-call-graph-for-functions- in-shared-library-that-is-linke –

Respuesta

5

Me puse un poco curioso ya que todavía está roto en OpenSuse 12.x. Hubiera pensado que un error reportado originalmente en el '09 más o menos ya habría sido resuelto. Supongo que nadie realmente usa Sprof. (o tal vez dl-open es tan frágil que la gente tiene miedo de tocarlo :-)

El problema se reduce a la marca __RTLD_SPROF utilizada como argumento para dlopen. Tome cualquier programa simple que llame a dlopen, o ese indicador al segundo arg y obtendrá la misma aserción fallida. He utilizado el programa de ejemplo en la parte inferior de http://linux.die.net/man/3/dlopen como ejemplo

handle = dlopen(argv[1], RTLD_LAZY | __RTLD_SPROF); 

De lo que puedo decir de un vistazo rápido a dl-open.c, este banderas cortos circuitos algunos de lo dl_open hace. Por lo tanto, el r_flag especificado en la afirmación no se establece en RT_CONSISTENT.

+1

Esto es un poco molesto. Mucha gente sugiere oprofile en su lugar, pero hasta ahora no había podido construir eso tampoco. ¿Tienes alguna sugerencia sobre cómo perfilar una biblioteca compartida? – dirac3000

Cuestiones relacionadas