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:
- Usar
ltrace
olatrace
:Tener unltrace
-style lista detallada
de qué proceso llamó a la función que me interesa con qué
argumentos serían perfectos, peroltrace
solo funciona con un
proceso individual o grupos de procesos. No puedo escribirltrace -e
y ver todos los usos en todo el sistema.
[email protected]_lib -fp 1 - 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. 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.- 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 . - 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?