GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿monitoreo de todo el sistema de llamadas a una función de biblioteca?

Tengo un escritorio Linux moderno con muchos procesos ejecutándose simultáneamente. Uno de esos procesos, y no sé cuál, llama a una función some_func de una biblioteca dinámica popular some_lib (piense en libc o libx11 , así que mucho de procesos lo usan), y quiero saber qué proceso hace eso (e idealmente, tener un seguimiento de pila de cada invocación).

¿Cómo determino qué proceso realiza una llamada a some_lib? ?

Opciones que he considerado hasta ahora:

  1. Usar ltrace o latrace :Tener un ltrace -style lista detallada
    de qué proceso llamó a la función que me interesa con qué
    argumentos serían perfectos, pero ltrace solo funciona con un
    proceso individual o grupos de procesos. No puedo escribir ltrace -e
    [email protected]_lib -fp 1
    y ver todos los usos en todo el sistema.
  2. Encuentra qué procesos usan mi biblioteca con lsof , luego continúe con el paso 1:eso sería muy engorroso, ya que hay demasiados procesos que usan la misma biblioteca, pero no llaman a dicha función.
  3. grep -r some_func /usr , luego vea si solo hay un par de binarios capaces de llamar a la función, y trabaje desde allí. Aunque eso podría funciona en una cantidad limitada de casos, esta no es de ninguna manera una solución general, y no funcionaría si, p. some_func es omnipresente en varios binarios, pero rara vez se llama.
  4. Utilice el sistema de auditoría del kernel. Si estuviera rastreando una llamada al sistema, podría escribir auditctl -S some_syscall ... y eso haría el truco en el registro de invocaciones en todo el sistema. Sin embargo, auditctl no parece ser capaz de hacer el mismo nivel de granularidad con funciones de biblioteca .
  5. Finalmente, pude reconstruir la biblioteca, agregando una nueva línea a la función que me interesa que registraría todas sus invocaciones. Si bien se garantizaría que esto resolvería mi problema, esa solución sería engorrosa y requeriría modificar/recompilar la biblioteca y al menos 2 reinicios para implementar la biblioteca instrumentada y revertirla después de encontrar al culpable.

¿Hay una manera más fácil?

(Quiero señalar que esta es una pregunta general, y estoy más interesado en soluciones generales que simplemente funcionen).

Encontré un buen artículo de comparación que menciona algunas instalaciones de rastreo más que no conocía, que puede valer la pena explorar.

Respuesta aceptada:

SystemTap con debuginfo puede rastrear llamadas a funciones en bibliotecas; en un sistema Centos 7:

$ sudo stap -L 'process("/lib64/libglib*").function("*strndup*")'
process("/usr/lib64/libglib-2.0.so.0.5000.3").function("g_strndup")
$ 

Y esto se puede usar como una probe punto que imprime backtraces o lo que quieras que se puede escribir con SystemTap:

probe begin {
    printf("okn")
}
probe process("/usr/lib64/libglib-2.0.so.0.5000.3").function("g_strndup") {
    /* printf("%s[%d]n", execname(), pid()) */
    print_usyms(ubacktrace())
}

guardado como probelibraryfunc.stp esto se puede ejecutar a través de

$ sudo stap probelibraryfunc.stp

aunque puede producir cantidades increíbles de resultados si la llamada es común...

Relacionado:¿Es posible alimentar Open Office a través de STDIN?
Linux
  1. Una guía para comprender las bibliotecas de software de Linux en C

  2. Comprender las llamadas al sistema en Linux con strace

  3. Cómo instalar la biblioteca Ncurses en Linux

  4. ¿Por qué mi función cat con llamadas al sistema es más lenta en comparación con cat de Linux?

  5. ¿Cuál es la diferencia entre una llamada de biblioteca y una llamada de sistema en Linux?

Instale la herramienta de monitoreo de rendimiento de NetData en Linux

Supervisión de procesos en Linux

Monitoreo del ancho de banda en Linux con Nethogs

Optimizador y monitoreo del sistema Stacer Linux

¿Qué son las llamadas al sistema Linux y las funciones de biblioteca?

Use una biblioteca C en Swift en Linux