Eu tenho um desktop Linux moderno com muitos processos em execução simultaneamente. Um desses processos, e não sei qual deles, chama uma função some_func
de uma biblioteca dinâmica popular some_lib
(pense em libc
ou libx11
, então muitos processos a usam) e quero saber qual processo faz isso (e idealmente, ter um rastreamento de pilha de cada invocação).
Como faço para determinar qual processo faz uma chamada some_lib
?
Opções que considerei até agora:
- Use
ltrace
oulatrace
: Ter umaltrace
lista detalhada de qual processo chamou a função em que estou interessado com quais argumentos seria perfeito, masltrace
só funciona com um processo individual ou grupos de processos. Não posso simplesmente digitarltrace -e some_func@some_lib -fp 1
e ver todos os usos em todo o sistema. - Encontre quais processos usam minha biblioteca com
lsof
, então prossiga com a etapa 1: Isso seria muito complicado, pois há muitos processos usando a mesma biblioteca, mas não chamando a referida função. grep -r some_func /usr
, então veja se há apenas alguns binários capazes de chamar a função e trabalhe a partir daí. Embora isso possa funcionar em alguns casos limitados, isso não é de forma alguma uma solução geral e não funcionaria se, por exemplosome_func
, for onipresente em vários binários, mas raramente for chamado.- Use o sistema de auditoria do kernel. Se eu estivesse rastreando uma chamada de sistema, poderia digitar
auditctl -S some_syscall ...
e isso funcionaria no registro de invocações em todo o sistema. No entanto,auditctl
não parece ser capaz de fazer o mesmo nível de granularidade com funções de biblioteca . - Finalmente, eu poderia reconstruir a biblioteca, adicionando uma nova linha à função em que estou interessado que registraria todas as suas invocações. Embora isso certamente resolva meu problema, essa solução seria complicada e exigiria a modificação/recompilação da biblioteca e pelo menos 2 reinicializações para implantar a biblioteca instrumentada e revertê-la depois de encontrar o culpado.
Existe uma maneira mais fácil?
(Gostaria de salientar que esta é uma questão geral e estou interessado principalmente em soluções gerais que simplesmente funcionariam.)
Encontrei um bom artigo de comparação mencionando mais alguns recursos de rastreamento que eu não conhecia, que podem valer a pena explorar.
SystemTap com debuginfo pode rastrear chamadas de função em bibliotecas; em um sistema Centos 7:
E isso pode ser usado como um
probe
ponto que imprime backtraces ou o que você quiser que pode ser escrito com o SystemTap:salvo, pois
probelibraryfunc.stp
isso pode ser executado viaembora possa produzir quantidades loucas de saída se a chamada for comum ...