Monitoramento em todo o sistema de chamadas para uma função de biblioteca

2

Eu tenho um desktop Linux moderno com muitos processos em execução simultaneamente. Um desses processos, e eu não sei qual, chama uma função some_func de uma biblioteca dinâmica popular some_lib (pense em libc ou libx11 , então um lote de processos usá-lo), e eu quero saber qual processo faz isso (e idealmente, ter um rastreamento de pilha de cada invocação).

Como determino qual processo faz uma chamada para some_lib ?

Opções que eu considerei até agora:

  1. Use ltrace ou latrace : tendo uma lista detalhada de ltrace de que processo chamado a função que eu estou interessado com o que argumentos seriam perfeitos, mas ltrace só funciona com um processos individuais ou grupos de processos. Não consigo digitar ltrace -e some_func@some_lib -fp 1 e ver todos os usos em todo o sistema.
  2. Encontre quais processos usam minha biblioteca com lsof e prossiga com a etapa 1: Isso seria muito trabalhoso, pois há muitos processos usando a mesma biblioteca, mas não chamando essa função.
  3. grep -r some_func /usr , em seguida, veja se há apenas alguns binários capazes de chamar a função e trabalhe meu caminho a partir daí. Embora isso possa funcionar em algumas quantidades limitadas de casos, isso não é de forma alguma uma solução geral e não funcionaria se, por exemplo, some_func é onipresente em vários binários, mas raramente é chamado.
  4. Use o sistema de auditoria do kernel. Se eu estivesse rastreando uma chamada do sistema, eu poderia digitar auditctl -S some_syscall ... e isso funcionaria na criação de log de invocações do sistema. No entanto, auditctl não parece ser capaz de fazer o mesmo nível de granularidade com funções de biblioteca .
  5. Finalmente, eu poderia reconstruir a biblioteca, adicionando uma nova linha à função na qual estou interessado e registrando todas as invocações. Embora isso pudesse garantir a solução do meu problema, essa solução seria incômoda e exigiria a modificação / recompilação da biblioteca e pelo menos duas reinicializações para implantar a biblioteca instrumentada e revertê-la depois de encontrar o culpado.

Existe uma maneira mais fácil?

(Eu quero ressaltar que esta é uma questão geral, e estou mais interessado em soluções gerais que simplesmente funcionariam.)

Eu encontrei um bom artigo de comparação mencionando alguns mais instalações de rastreamento que eu não conhecia, que podem valer a pena explorar.

    
por undercat 27.01.2018 / 07:03

1 resposta

3

O SystemTap com debuginfo pode rastrear chamadas de função em bibliotecas; em um sistema Centos 7:

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

E isso pode ser usado como um ponto probe que imprime backtraces ou o que você quiser que possa ser gravado com o SystemTap:

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

salvo como probelibraryfunc.stp , isso pode ser executado via

$ sudo stap probelibraryfunc.stp

embora possa produzir quantidades loucas de saída se a chamada for comum ...

    
por 27.01.2018 / 17:34