Linux üzerinde çalışan programlar işletim sisteminin yönettiği kaynakları kullanmak istediğinde (dosya okuma, proses yaratmak, vb) işletim sistemine sistem çağrıları yapar.
Sistem çağrıları, çekirdek seviyesinde çalışıp gerekli işlemleri gerçekleştirerek kontrolü tekrar kendisini çağıran programa bırakır.
Anlaşılacağı üzere sistem çağrıları (System Calls) programlarla işletim sistemi arasında bir arayüz sağlamaktadır. Sistem çağrılarına örnek olarak open, read, close, fork, recvfrom, signal, mprotect verilebilir.
Bir program strace ile başlatılırsa veya çalışırken strace programa bağlanırsa (attach) ilgili programın yaptığı bütün sistem çağrıları takip edilebilir. Aşağıdaki ekran çıktısında ls komutu strace ile başlatılmış ve yaptığı sistem çağrıları gösterilmiştir.
strace, sergilediği sistem çağrılarıyla programların davranışlarının izlenebilmesini sağlamakta, problemlerin tespit edilmesinde ve programların karakteristiğini göstermekte çok önemli bir rol oynamaktadır.
Örneğin aşağıda test.txt dosyası yokken strace ile çalıştırılmıştır. Görüldüğü üzere open sistem çağrısı ile test.txt dosyasını açmaya çalışmış ancak dosya bulunmadığı için ENOENT hatası alarak ekrana default mesajı bastırmıştır.
Aşağıda test.txt dosyası oluşturulup tekrar çalıştırılmıştır. strace ile gözlemlenen sistem çağrılarından test.txt dosyasını okuyup içeriğini ekrana bastığı görülmektedir.
strace direkt olarak sistem çağrılarını dinlediği için çalıştırılan programın kodunun açık/kapalı olmasından bağımsız olarak çalışma zamanı dinamiklerini ortaya koyabilmektedir. strace kullanılarak başlatılırken hata alınan programların neden başlatılamadığı (konfigürasyon dosyasının bulunamaması, yanlış yerde aranması, kullanıcı yetkisinin yeterli olmaması, vb) ile ilgili fikir elde edilebilir. Benzer şekilde beklenmeyen şekilde sonlanan bir programın neden sonlandığı (prosese sonlandırıcı bir sinyal gönderilmesi, vb) strace ile anlaşılabilir.
Tahmin edilebileceği üzere strace, sistem kaynaklarını gereksiz şekilde çok kullanan programlardaki hataların bulunmasına yardımcı olabilir. Aynı şekilde bir programın işletim sistemi kaynaklarını kullanırken sergilediği karakteristik de strace ile ortaya konabilir. strace, -c parametresi ile çalıştırıldığında programın yaptığı sistem çağrıları ile ilgili istatistikleri toplamakta ve ekrana bastırmaktadır.
strace prosesin ilk çalıştırılma seramonisindeki sistem çağrıları da dahil olmak üzere bütün sistem çağrılarını yakalar. Çoğunlukla strace’in izini süreceği sistem çağrılarını filtrelemek faydalı olabilir. -e parametresi ile aşağıdaki belirtilen grup(lar) filtrelenebilir.
strace -e trace=desc cat test.sh > /dev/null strace -e trace=file cat test.sh > /dev/null strace -e trace=network,file cat test.sh > /dev/null strace -e trace=memory cat test.sh > /dev/null strace -e trace=signal cat test.sh > /dev/null strace -e trace=signal,process cat test.sh > /dev/null
-p parametresi ile verilecek proses id veya id’ler ile strace, önceden başlatılmış proseslere attach edilebilir. Aşağıdaki örnekte strace sunucu üzerinde çalışan nginx proseslerinin yaptığı sistem çağrıları yakalamak üzere ayarlanmıştır.
strace -p $(pidof mysqld)
strace’in az bilinen önemli özelliklerinden birisi proseslerin ağ üzerinden yaptığı paket alışverişlerini de izleyebilmesidir. strace default olarak string’leri 32 karakterde keser, bütün string’i görebilmek için -s parametresi ile maksimum uzunluk belirlenebilir.
strace -s 10000 -e trace=network -p 17344
<strong>-t parametresi ile</strong> zamansal olarak sistem fonksiyonlarının çalışma dilimlerini gösterir.
strace -t -e open ls /home
-o parametresi ile aşina olduğumuz üzere çıktıları bir dosyaya yönlendirebiliriz.
strace -o output.txt ls
https://www.thegeekstuff.com/2011/11/strace-examples/
İyi Çalışmalar…
Mustafa Bektaş Tepe