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:
- Gunakan
ltrace
ataulatrace
:Memilikiltrace
-gaya daftar terperinci
dari proses apa yang disebut fungsi Saya tertarik dengan argumen
apa yang akan sempurna, tetapiltrace
hanya bekerja dengan
proses individu atau kelompok proses. Saya tidak bisa hanya mengetikltrace -e
dan lihat semua penggunaan di seluruh sistem.
[email protected]_lib -fp 1 - 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. 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.- 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 . - 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?