Linux’ta strace ve lsof ile Uygulama Hatalarını Bulma
Bazı Linux sistemlerde herhangi bir hata mesajı üretmeden kapanabilir veya başlatılamayabilir. Böyle durumlarda yalnızca log dosyalarına güvenmek yanıltıcı olabilir. Uygulamanın sistem üzerinde gerçekleştirdiği işlemleri ve erişmeye çalıştığı kaynakları izlemek, sorunun kaynağını bulmak için daha etkili bir yöntemdir.
strace Nedir?
strace, bir sürecin yaptığı sistem çağrılarını ve bu çağrılara işletim sistemi tarafından verilen yanıtları gösterir. Uygulamanın hangi dosyaya erişemediği, hangi bağlantının başarısız olduğu veya hangi hata kodunun döndüğü bu sayede net şekilde tespit edilir.
strace varsayılan kullanımda oldukça ayrıntılı bir çıktı üretir. Bu ayrıntı bazı durumlarda faydalı olsa da, ilk aşamada sorunun kaynağını bulmayı zorlaştırabilir. Bu yüzden hata odaklı bir izleme tercih edilebilir.
strace -e fault=all ./uygulamaBu yöntem, hataya neden olan sistem çağrılarını doğrudan göstererek gereksiz satırları elememizi sağlar.
Birçok uygulama, çalışabilmek için belirli yapılandırma dosyalarına veya kütüphanelere ihtiyaç duyar. Bu dosyalara erişim sağlanamadığında uygulama hiç başlamayabilir. Bu nedenle dosya erişimlerini izlemek kritik bir adımdır.
strace -e trace=open,openat,access,stat,newfstatat ./uygulamaÇıktıda şu satırı görüyorsak,
open("/etc/app/config.yml", O_RDONLY) = -1 ENOENTbu, uygulamanın beklediği dosyanın sistemde mevcut olmadığını gösterir. Dosya yolu, konfigürasyon parametreleri ve servis kullanıcısının yetkileri bu noktada gözden geçirilmelidir.
strace Çıktısını Dosya Üzerinden Analiz Edelim
strace ile izlenen sistem çağrıları genellikle oldukça fazladır. Terminal yerine bir dosya üzerinden çalışmak, çıktıyı filtrelemeyi ve hataya odaklanmayı çok daha verimli hâle getirir.
strace -o hata.log ./uygulamaEksik Dosya Hatalarını İnceleyelim
Uygulamanın çalışmaması çoğu zaman ihtiyaç duyduğu bir dosyayı bulamamasından kaynaklanır. ENOENT hata kodu, bu durumun en net göstergesidir.
grep -i ENOENT hata.logYetki Problemlerini Belirleyelim
Dosya var olmasına rağmen erişilemiyorsa, bu durum genellikle yetki sorunlarını işaret eder. strace çıktısında yer alan EACCES hataları bu tür problemleri açıkça gösterir.
grep -i EACCES hata.logServis Aktif Ama Bağlantı Kurulamıyorsa
Servis çalışıyor gibi görünmesine rağmen yanıt vermiyorsa, sürecin beklediği noktayı tespit etmek gerekir. Önce PID bilgisini alalım.
ps aux | grep uygulamaArdından sürece strace ile bağlanalım.
strace -p 2451lsof Nedir ve Ne Zaman Kullanılır?
Bir uygulama çalışmıyorsa veya bağlantı kuramıyorsa, yalnızca strace çıktısına bakmak yeterli olmayabilir. strace, uygulamanın hangi işlemleri yapmak istediğini gösterirken, lsof bu işlemlerin sistem üzerinde gerçekten gerçekleşip gerçekleşmediğini gösterir. Açık portlar, kullanılan dosyalar ve aktif bağlantılar lsof ile doğrudan görülebilir. Bu iki araç birlikte kullanıldığında sorun tahmine dayalı değil, somut verilerle analiz 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 Sorular Sorular
Çalışan bir servise strace bağlanamıyorum sebebi ne olabilir?
Servis farklı bir kullanıcı veya root yetkisiyle çalışıyorsa, yetkisiz kullanıcılar strace ile sürece bağlanamaz. Bu durumda sudo kullanılarak işlem tekrarlanmalıdır.
Container ortamında çalışan bir uygulamayı strace ile izlemek neden zor?
Docker container’lar güvenlik nedeniyle kernel izleme yetkilerini sınırlar. Bu yüzden strace kullanılabilmesi için container’ın SYS_PTRACE yetkisine sahip olması gerekir. Aksi hâlde izleme işlemi kernel tarafından engellenir.
Ayrıca container içinde yaşanan bağlantı problemleri çoğu zaman ağ driver’ları ve özel network yapılandırmalarıyla ilişkilidir.
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.
