strace ne işe yarar ve nasıl kullanılır?

Bu flood’da Linux’ta sistem çağrılarının izini sürmemizi sağlayan strace aracını tanıtacağım.

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. Örnek olarak, nologin programı Linux dağıtımlarında servis (web sunucu, ftp sunucu, vb) amaçlı açılan kullanıcı hesaplarından sisteme terminal veya ssh ile login olunmasını engellemek için kullanılır. Bu hesaplar kullanılarak sisteme bağlanmaya çalışan kullanıcıya gösterilen hata mesajı /etc/nologin.txt dosyası ile özelleştirilebilir.

Aşağıda nologin programı /etc/nologin.txt dosyası yokken strace ile çalıştırılmıştır. Görüldüğü üzere nologin, open sistem çağrısı ile /etc/nologin.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 nologin programı bu kez /etc/nologin.txt dosyasına içerik olarak Custom nologin message mesajı eklenerek tekrar çalıştırılmıştır. strace ile gözlemlenen sistem çağrılarından nologin'in /etc/nologin.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. Aşağıda curl, strace ile çalıştırılıp bir web sayfası indirilmiş ve curl'ün yaptığı sistem çağrıları gösterilmiştir.

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.

-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'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 ile incelenen programda sadece belirli bir veya birkaç sistem çağrısı izlenmek istenirse -e ile birlikte ilgili sistem çağrılarının isimleri verilebilir. Aşağıdaki çıktıda sadece sendto ve recvfrom sistem çağrıları izlenmiştir.

Yukarıdaki sayılanlar dışında strace -h ile strace'in birçok başka özelliği keşfedilebilir. strace sadece Linux'ta çalışmaktadır. strace'in macOS'te muadili dtrace, Windows'taki muadili ise Sysinternals araçlarından Process Monitor'dür. Bu iki araç ile strace'in çalışma prensiplerinin karşılaştırılmasını ilerleyen flood'larda yapacağız. Son olarak dtrace'i Joyent'in CTO'su Bryan Cantrill - @bcantrill, Sysinternals araçlarını ise Microsoft Azure CTO'su Mark Russinovich - @markrussinovich ortaya çıkarmıştır :-)