Jadi baru-baru ini, saya mendiskusikan strace dengan seseorang, dan mereka bertanya apa yang akan terjadi jika Anda menelusuri proses yang sedang berjalan seperti membuat soket jaringan atau yang serupa. Mungkinkah ini menyebabkan program mogok dengan cara yang tidak terduga?
Dari apa yang saya baca tentang ptrace, syscall yang digunakan oleh strace, seharusnya tidak dapat menyebabkan hal seperti itu jika Anda hanya men-debug sebuah utas. Proses dihentikan, setiap kali syscall dipanggil, tetapi nanti harus dilanjutkan dan tidak ada yang lebih bijaksana. Sinyal diantrekan saat tidak berjalan, jadi saya berasumsi hal serupa terjadi dengan syscalls/sockets/listen.
Bisakah ptrace yang digunakan dalam konteks strace menyebabkan proses aneh macet?
Jawaban yang Diterima:
Tidak , strace
seharusnya tidak menyebabkan crash program –
Kecuali dalam kasus yang agak tidak biasa ini:
Jika memiliki bug yang bergantung pada waktu eksekusi , atau lokasi memoritime waktu proses .
Ini dapat memicu “heisenbug . semacam ini ” – tetapi sangat jarang, karena jenis bug ini jarang terjadi, dan hanya perlu dipicu di bawah strace atau instrumentasi lainnya.
Dan ketika Anda menemukan heisenbug, itu sering kali merupakan hal yang baik.
Mengenai ptrace()
– syscall – itulah yang strace
tidak di dalam saya pikir, jadi mirip. Seseorang dapat melakukan lebih dari strace
bisa saat menggunakan ptrace()
secara langsung.
Contoh Anda adalah bug semacam ini:
Dalam contoh, strace
akan mengubah waktu langkah-langkah untuk membuat koneksi jaringan. Jika itu menyebabkan masalah, itu adalah "masalah yang menunggu untuk terjadi" - waktu eksekusi berubah terus-menerus. Dengan strace
, hanya sedikit lagi. Tetapi aplikasi lain dapat lebih mengubah waktu, seperti memulai sebuah program.