universitaria una trabajan servicios que publica personas funciones funciona como bibliotecas biblioteca actualidad c debugging profiling gprof sprof

trabajan - gprof: cómo generar un gráfico de llamadas para funciones en una biblioteca compartida que está vinculada al programa principal



personas que trabajan en una biblioteca (3)

Estoy trabajando en el entorno Linux. Tengo dos paquetes fuente ''C'' train y test_train.

  1. paquete de tren cuando se compila genera libtrain.so
  2. test_train se vincula a libtrain.so y genera una prueba de tren ejecutable

Ahora quiero generar un gráfico de llamadas usando gprof que muestre la secuencia de funciones de llamada en el programa principal, así como las que están dentro de libtrain.so

Estoy compilando y vinculando ambos paquetes con la opción -pg y el nivel de depuración es o0. Después de hacer ./train-test, se genera gmon.out. Entonces lo hago:

$ gprof -q ./train-test gmon.out

Aquí, la salida muestra el gráfico de llamadas de funciones en train-test pero no en libtrain.so

Cual podría ser el problema ?


Estoy cargando mi biblioteca de Python y no tuve suerte con sprof . En su lugar, usé oprofile , que estaba en los repositorios de Fedora, al menos:

operf --callgraph /path/to/mybinary

Espere a que termine su aplicación o haga Ctl-c para detener la creación de perfiles. Ahora generemos un resumen de perfil:

opreport --callgraph --symbols

Consulte la documentation para interpretarla. Es una especie de desastre. En el informe generado, cada símbolo se enumera en un bloque propio. El símbolo principal del bloque es el que no tiene sangría. Los elementos que están sobre ella son funciones que llaman a esa función, y las que están debajo son las cosas a las que llama. Los porcentajes en la sección de abajo son la cantidad relativa de tiempo que pasaron en esas personas.


Si no está en Linux (como yo en Solaris), simplemente no tiene suerte ya que no hay ningún sprof allí. Si tiene las fuentes de su biblioteca, puede resolver su problema vinculando una biblioteca estática y haciendo su perfil binario con ese en su lugar. Otra forma en que logro rastrear llamadas a bibliotecas compartidas es mediante el uso de truss . Con la opción -u [!]lib,...:[:][!]func, ... se puede obtener una buena imagen del historial de llamadas de una carrera. No es completamente lo mismo que crear perfiles, pero puede ser muy útil en algunos escenarios.


gprof no funcionará, necesitas usar sprof en sprof lugar. He encontrado estos enlaces útiles:

Resumen del segundo enlace:

  1. Compile su biblioteca compartida (libmylib.so) en modo debug (-g). No-ppg.
  2. exportar LD_PROFILE_OUTPUT = `pwd`
  3. exportar LD_PROFILE = libmylib.so
  4. rm -f $ LD_PROFILE.profile
  5. Ejecuta tu programa que carga libmylib.so
  6. sprof PATH-TO-LIB / $ LD_PROFILE $ LD_PROFILE.profile -p> log
  7. Ver el registro.

Descubrí que en el paso 2, debe ser un directorio existente; de ​​lo contrario, recibirá una advertencia útil. Y en el paso 3, es posible que deba especificar la biblioteca como libmylib.so.X (tal vez incluso .XY , no estoy seguro); de lo contrario, no recibirá ninguna advertencia.