GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:monitoraggio a livello di sistema delle chiamate a una funzione di libreria?

Ho un desktop Linux moderno con molti processi in esecuzione contemporaneamente. Uno di quei processi, e non so quale, chiama una funzione some_func da una popolare libreria dinamica some_lib (pensa a libc o libx11 , quindi un molto di processi lo usa) e voglio sapere quale processo lo fa (e idealmente, avere una traccia dello stack di ogni invocazione).

Come faccio a determinare quale processo effettua una chiamata a some_lib ?

Opzioni che ho considerato finora:

  1. Usa ltrace o latrace :Avere un latrace -style elenco dettagliato
    di quale processo ha chiamato la funzione che mi interessa con quali
    argomenti sarebbero perfetti, ma ltrace funziona solo con un
    singolo processo o gruppi di processi. Non posso semplicemente digitare ltrace -e
    [email protected]_lib -fp 1
    e vedere tutti gli usi a livello di sistema.
  2. Trova quali processi utilizzano la mia libreria con lsof , quindi procedi con il passaggio 1:sarebbe molto ingombrante, poiché ci sono troppi processi che utilizzano la stessa libreria, ma non chiamano tale funzione.
  3. grep -r some_func /usr , quindi controlla se ci sono solo un paio di binari in grado di chiamare la funzione e procedi da lì. Anche se potrebbe funziona in un numero limitato di casi, questa non è affatto una soluzione generale e non funzionerebbe se ad es. some_func è onnipresente in vari binari ma è chiamato raramente.
  4. Usa il sistema di controllo del kernel. Se stavo tracciando una chiamata di sistema, potrei digitare auditctl -S some_syscall ... e questo farebbe il trucco per registrare le invocazioni a livello di sistema. Tuttavia, auditctl non sembra essere in grado di fare lo stesso livello di granularità con le funzioni di libreria .
  5. Finalmente, ho potuto ricostruire la libreria, aggiungendo una nuova riga alla funzione che mi interessa che registrerebbe tutte le sue invocazioni. Anche se questo sarebbe garantito per risolvere il mio problema, quella soluzione sarebbe ingombrante e richiederebbe la modifica/ricompilazione della libreria e almeno 2 riavvii per implementare la libreria strumentata e ripristinarla dopo aver trovato il colpevole.

C'è un modo più semplice?

(Voglio sottolineare che questa è intesa come una domanda generale e sono principalmente interessato a soluzioni generali che funzionerebbero.)

Ho trovato un bell'articolo di confronto che menziona alcune altre strutture di tracciamento di cui non ero a conoscenza, che potrebbe valere la pena esplorare.

Risposta accettata:

SystemTap con debuginfo può tracciare le chiamate di funzione nelle librerie; su 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")
$ 

E questo può essere usato come probe punto che stampa backtrace o qualsiasi cosa tu voglia che può essere scritta 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())
}

salvato come probelibraryfunc.stp questo può essere eseguito tramite

$ sudo stap probelibraryfunc.stp

anche se può produrre quantità pazze di output se la chiamata è comune...

Correlati:È possibile alimentare Open Office tramite STDIN?
Linux
  1. Monitoraggio dell'accesso ai file Linux?

  2. Come inizializzare una libreria condivisa su Linux

  3. fflush() non funziona in Linux

  4. Usa una libreria C in Swift su Linux

  5. Qual è la differenza tra una chiamata di libreria e una chiamata di sistema in Linux?

Installa lo strumento di monitoraggio delle prestazioni NetData su Linux

Monitoraggio dei processi su Linux

Monitoraggio della larghezza di banda su Linux con Nethogs

Ottimizzatore e monitoraggio del sistema Stacer Linux

Che cosa sono le chiamate di sistema Linux e le funzioni di libreria?

Mutex a livello di sistema in Python su Linux