GNU/Linux >> Belajar Linux >  >> Linux

Linux - Pemantauan Seluruh Sistem Panggilan Ke Fungsi Perpustakaan?

Saya memiliki desktop Linux modern dengan banyak proses yang berjalan secara bersamaan. Salah satu proses itu, dan saya tidak tahu yang mana, memanggil fungsi some_func dari perpustakaan dinamis populer some_lib (pikirkan libc atau libx11 , jadi banyak proses menggunakannya), dan saya ingin tahu proses apa yang melakukan itu (dan idealnya, memiliki jejak tumpukan setiap permintaan).

Bagaimana cara menentukan proses mana yang melakukan panggilan ke some_lib ?

Opsi yang telah saya pertimbangkan sejauh ini:

  1. Gunakan ltrace atau latrace :Memiliki ltrace -gaya daftar terperinci
    dari proses apa yang disebut fungsi Saya tertarik dengan argumen
    apa yang akan sempurna, tetapi ltrace hanya bekerja dengan
    proses individu atau kelompok proses. Saya tidak bisa hanya mengetik ltrace -e
    [email protected]_lib -fp 1
    dan lihat semua penggunaan di seluruh sistem.
  2. Temukan proses apa yang menggunakan perpustakaan saya dengan lsof , lalu lanjutkan dengan langkah 1:Itu akan sangat merepotkan, karena ada terlalu banyak proses yang menggunakan pustaka yang sama, tetapi tidak memanggil fungsi tersebut.
  3. grep -r some_func /usr , lalu lihat apakah hanya ada beberapa binari yang mampu memanggil fungsi tersebut, dan mulai dari sana. Meskipun itu bisa bekerja dalam beberapa kasus dalam jumlah terbatas, ini sama sekali bukan solusi umum, dan tidak akan berfungsi jika mis. some_func ada di mana-mana di berbagai binari tetapi jarang disebut.
  4. Gunakan sistem audit kernel. Jika saya melacak panggilan sistem, saya bisa mengetik auditctl -S some_syscall ... dan itu akan membantu dalam mencatat pemanggilan di seluruh sistem. Namun, auditctl tampaknya tidak mampu melakukan tingkat perincian yang sama dengan fungsi perpustakaan .
  5. Akhirnya, saya bisa membangun kembali perpustakaan, menambahkan baris baru ke fungsi yang saya minati yang akan mencatat semua permintaannya. Meskipun ini dijamin akan menyelesaikan masalah saya, solusi itu akan merepotkan dan memerlukan modifikasi/kompilasi ulang perpustakaan dan setidaknya 2 reboot untuk meluncurkan perpustakaan berinstrumen dan untuk memutar kembali setelah menemukan pelakunya.

Apakah ada cara yang lebih mudah?

(Saya ingin menunjukkan bahwa ini dimaksudkan sebagai pertanyaan umum, dan saya sebagian besar tertarik pada solusi umum yang akan Berhasil.)

Saya menemukan artikel perbandingan yang bagus yang menyebutkan beberapa fasilitas pelacakan yang tidak saya ketahui, yang mungkin perlu ditelusuri.

Jawaban yang Diterima:

SystemTap dengan debuginfo dapat melacak panggilan fungsi di perpustakaan; pada sistem Centos 7:

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

Dan ini dapat digunakan sebagai probe titik yang mencetak jejak balik atau apa pun yang Anda inginkan yang dapat ditulis dengan 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())
}

disimpan sebagai probelibraryfunc.stp ini dapat dijalankan melalui

$ sudo stap probelibraryfunc.stp

meskipun dapat menghasilkan jumlah output yang gila jika panggilan itu biasa…

Terkait:Apakah mungkin memberi makan Open Office melalui STDIN?
Linux
  1. Panduan untuk memahami pustaka perangkat lunak Linux di C

  2. Cara Memasang Pustaka Ncurses Di Linux

  3. Python any() Fungsi di Linux

  1. Pengantar pemantauan akun pengguna Linux

  2. Mengapa fungsi kucing saya dengan panggilan sistem lebih lambat dibandingkan dengan kucing Linux?

  3. Mutex seluruh sistem dengan Python di Linux

  1. Memahami panggilan sistem di Linux dengan strace

  2. Pemantauan Akses File Linux?

  3. Gunakan perpustakaan C di Swift di Linux