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.

linux strace 1
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.

linux strace 2
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.

linux strace 3

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.

linux strace 4

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)

linux strace 5
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://medium.com/@gokhansengun/strace-ne-i%C5%9Fe-yarar-ve-nas%C4%B1l-kullan%C4%B1l%C4%B1r-c46036ffa0

https://www.thegeekstuff.com/2011/11/strace-examples/

İyi Çalışmalar…
Mustafa Bektaş Tepe

Loading