Linux Sistemleri

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

Bu 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 ENOENT

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

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

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

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

Ardından sürece strace ile bağlanalım.

strace -p 2451

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

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir