Linux sistemlerde bir uygulama beklenmedik şekilde kapanıyor veya başlatılamıyorsa, sorun her zaman log dosyalarında açıkça görünmeyebilir. Bu tür durumlarda yalnızca uygulama çıktısına bakmak yeterli olmaz. Uygulamanın işletim sistemi üzerinde hangi işlemleri yaptığı, hangi dosya ya da portlara erişmeye çalıştığı doğrudan izlenmelidir.
strace Nedir? Ne İşe Yarar?
strace, bir sürecin işletim sistemiyle yaptığı sistem çağrılarını ve bu çağrılara verilen yanıtları izlemeye yarayan bir araçtır. Uygulamanın hangi dosyayı açmaya çalıştığını, hangi bağlantıyı kurduğunu veya hangi hata koduyla geri döndüğünü ayrıntılı şekilde gösterir. Bu sayede uygulamanın neden çalışmadığı sistem seviyesinde net biçimde analiz edilebilir.
Varsayılan şekilde çalıştırıldığında strace ./uygulama çıktısı oldukça kalabalık olabilir. Bu durum, özellikle hızlı bir teşhis yapılmak istendiğinde analiz sürecini zorlaştırır. Bu yüzden ya çıktıyı dosyaya yönlendiririz ya da yalnızca hata üreten çağrıları filtreleyerek izleriz.
strace -e fault=all ./uygulamaBu kullanımda strace, sadece hata dönen satırları gösterir. Uygulamanın nerede takıldığı veya hangi işlemde başarısız olduğu net şekilde ortaya çıkar.
Dosya Sorunu Var mı Kontrol Edelim
Uygulama başlatılamıyorsa en sık karşılaşılan nedenlerden biri, gerekli bir dosyaya veya kütüphaneye erişememesidir. Bu durumu netleştirmek için yalnızca dosya ile ilgili sistem çağrılarını izlemek doğru bir başlangıç olur.
strace -e trace=open,openat,access,stat,newfstatat ./uygulamaEğer strace çıktısında aşağıdaki gibi bir satır görürsek,
open("/etc/app/config.yml", O_RDONLY) = -1 ENOENTbu, uygulamanın ihtiyaç duyduğu dosyanın sistemde bulunmadığını gösterir. Bu durumda dosya yolu, yapılandırma dosyasının konumu veya servis çalışırken kullanılan çalışma dizini kontrol edilmelidir.
strace Çıktısını Dosyaya Alarak İnceleyelim
strace çıktısı çoğu zaman terminalde anlık olarak takip edilemeyecek kadar uzundur. Bu nedenle tüm sistem çağrılarını bir dosyaya almak, hataları daha sonra sakin şekilde analiz etmeyi mümkün kılar ve süreci ciddi şekilde kolaylaştırır.
strace -o hata.log ./uygulamaEksik Dosya ve Kütüphane Hatalarını Bulma
Bir uygulama çalışmıyorsa ilk kontrol edilmesi gereken konu, erişilemeyen dosya veya dizinlerdir. ENOENT hata kodu, uygulamanın sistemde mevcut olmayan bir dosyaya veya dizine erişmeye çalıştığını gösterir. Bu tür hatalar genellikle eksik konfigürasyon dosyaları veya hatalı dosya yollarından kaynaklanır.
grep -i ENOENT hata.logYetki Problemlerini Tespit Etme
Dosya sisteminde mevcut olan bir dosyaya erişim sağlanamıyorsa, sorun çoğu zaman yetkilerle ilgilidir. strace çıktısında görülen EACCES hata kodu, erişim izninin engellendiğini açıkça gösterir.
grep -i EACCES hata.logServis Çalışıyor Ama Cevap Vermiyorsa
Bazı durumlarda servis çalışıyor gibi görünür ancak bağlantı kurulamaz veya yanıt alınamaz. Öncelikle sürecin PID bilgisini bulalım.
ps aux | grep uygulamaPID’yi bulduktan sonra çalışan sürece strace ile bağlanarak hangi noktada beklediğini görebiliriz.
strace -p 2451lsof Nedir?
strace, bir uygulamanın sistem üzerinde ne yapmaya çalıştığını gösterir. Hangi dosyayı açmak istediğini, hangi porta bağlanmaya çalıştığını veya hangi noktada hata aldığını net biçimde ortaya koyar. lsof ise sistemde o anda gerçekten hangi dosyaların ve portların açık olduğunu gösterir. Bu iki araç birlikte kullanıldığında, uygulamanın yapmak istediği işlem ile sistemdeki gerçek durum karşılaştırılabilir ve sorun çok daha net şekilde tespit edilir.
Önce sistemdeki açık bağlantıları görelim
lsof -i -n -PEğer belirli bir portu kimin kullandığını öğrenmek istiyorsak şu komut yeterlidir.
lsof -i :8080 -n -PPort dolu mu, kim kullanıyor sorusu burada netleşir.

strace ve lsof’un Birlikte Kullanımı
Önce lsof ile port veya dosya durumu kontrol edilir. Ardından strace ile uygulamanın bu kaynağa erişirken nerede hata aldığı görülür. Bu şekilde sorun tahminle değil, doğrudan gözle görülerek çözülür.
Önce araçlar kurulu mu bakalım.
which strace<br>which lsofKurulu değillerse yükleyelim.
apt install strace lsof -yUygulamayı strace ile başlatalım.
strace -ff -o trace ./uygulamaHata satırlarını ayıklayalım.
grep -i enoent trace.*<br>grep -i eacces trace.*<br>grep -i refused trace.*Port ve dosya durumunu kontrol edelim.
lsof -i -n -P<br>lsof +L1Gerekli düzeltmeleri yaptıktan sonra servisi yeniden başlatalım.
systemctl restart uygulamaSık Sorulan Sorular
strace ile çalışan bir süreci izlerken neden permission denied hatası alıyorum
Çalışan servisler çoğunlukla root yetkisiyle çalışır. Bu nedenle başka bir kullanıcıdan strace ile bağlanmaya çalışıldığında izin hatası alınır. Çözüm olarak komut sudo strace -p PID şeklinde çalıştırılmalıdır.
strace ile Docker container içindeki bir uygulamayı izleyebilir miyim?
Docker container içindeki bir uygulama strace ile izlenebilir ancak container’ın SYS_PTRACE yetkisine sahip olması gerekir. Bu yetki verilmediği sürece kernel seviyesinde izleme engellenir ve strace çalışmaz. Ayrıca bağlantı hataları çoğu zaman container’ın ağ yapılandırmasıyla ilişkilidir.
Bu nedenle Docker ağ yapısının nasıl çalıştığını bilmek önemlidir.
strace mi lsof mu önce kullanılmalı?
Port veya dosya çakışması şüphesi varsa önce lsof kullanılmalıdır. Uygulamanın neden başarısız olduğunu görmek gerekiyorsa strace tercih edilir.
lsof portu gösteriyor ama strace connect çağrısı başarısız
Bu genellikle yanlış IP’ye bağlanma, IPv4/IPv6 uyumsuzluğu veya firewall kuralı nedeniyle olur. lsof yalnızca portun açık olduğunu gösterir, bağlantının kabul edileceğini garanti etmez.