Linux’ta strace ve lsof ile Hata Bulma

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 ./uygulama

Bu 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 ./uygulama

Eğer strace çıktısında aşağıdaki gibi bir satır görürsek,

open("/etc/app/config.yml", O_RDONLY) = -1 ENOENT

bu, 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 ./uygulama

Eksik 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.log

Yetki 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.log

Servis Ç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 uygulama

PID’yi bulduktan sonra çalışan sürece strace ile bağlanarak hangi noktada beklediğini görebiliriz.

strace -p 2451

lsof 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 -P

Eğer belirli bir portu kimin kullandığını öğrenmek istiyorsak şu komut yeterlidir.

lsof -i :8080 -n -P

Port 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 lsof

Kurulu değillerse yükleyelim.

apt install strace lsof -y

Uygulamayı strace ile başlatalım.

strace -ff -o trace ./uygulama

Hata 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 +L1

Gerekli düzeltmeleri yaptıktan sonra servisi yeniden başlatalım.

systemctl restart uygulama

Sı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.

Yorum yapın