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 :-)