Mengkaitkan output strace dengan panggilan fungsi kode sumber

0

Saya mencoba untuk memperbaiki masalah keyboard di aplikasi Linux yang saya punya kode sumbernya. Aplikasi memulai server TCP dan mengirimkan acara keyboard dan mouse lokal ke klien yang terhubung. Apa cara terbaik untuk menginterogasi proses server yang sedang berjalan untuk mengetahui fungsi kode sumber yang digunakannya untuk menjebak penekanan tombol? Akankah strace pekerjaan utilitas untuk ini dalam beberapa cara? Menggunakan -c panji dengan strace menunjukkan panggilan sistem yang dibuat aplikasi, tetapi tidak yakin bagaimana melacaknya kembali ke fungsi file sumber.

joe
sumber

Jawaban:

1

Itu strace utilitas menunjukkan panggilan sistem kepada Anda. Sebagian besar program yang dikompilasi di Linux akhirnya terhubung dengan pustaka C standar, disebut sebagai "glibc" meskipun nama file pustaka yang sebenarnya adalah libc.so.6. Bahasa C "panggilan sistem" seperti "terbuka", "baca", "tulis" sebenarnya adalah fungsi pembungkus untuk panggilan sistem aktual yang dijalankan oleh pustaka glibc. Terkadang pembungkus menyertakan jumlah kode yang mengejutkan yang biasanya tidak Anda pikirkan. Terkadang programmer menggunakan pustaka dengan fungsi yang membuat beberapa panggilan glibc yang melakukan beberapa panggilan sistem. Selanjutnya, jika Anda melihat "baca" tertentu di strace output, Anda tidak memiliki cara untuk menghubungkannya dengan panggilan "baca" tertentu atau fungsi perpustakaan lain dalam kode sumber. Hasil dari ini adalah bahwa tidak ada cara umum untuk berkorelasi strace output dengan baris kode tertentu dalam file sumber.

Saya berasumsi bahwa ketika Anda menyatakan bahwa Anda memiliki kode sumber yang Anda maksudkan, Anda juga dapat mengkompilasinya menjadi program yang dapat dijalankan yang berfungsi. Jika ini memang masalahnya, maka taruhan terbaik Anda adalah dengan memasukkan kode printf s diikuti dengan fflush(stdout) dan kemudian jalankan program di bawah strace. Untuk printf s Anda dapat mencoba sesuatu seperti

printf(__FILE__ ", %s:%d Entered\n", __FUNCTION__, __LINE__), fflush(stdout);

pada awal setiap fungsi C. Anda dapat mendefinisikan baris di atas sebagai preprocessor marcro yang secara kondisional didefinisikan sebagai di atas atau tidak sama sekali, tergantung pada makro lain seperti DEBUG, sehingga Anda dapat meninggalkan makro ini di basis kode Anda dan kompilasi kode dengan atau tanpa DEBUG didefinisikan.

Anda akan melihat printf "tulis" panggilan sistem dan outputnya diselingi di antara panggilan sistem yang membaca penekanan tombol. Ini harus memungkinkan Anda membidik fungsi kode sumber yang membaca input tty. Mungkin membutuhkan usaha yang gigih.

Jonathan Ben-Avraham
sumber