Linux’ta strace ve lsof ile Uygulama Hatalarını Bulma

Linux sistemlerde çalışan bir uygulama aniden kapanıyor ya da hiç başlatılamıyorsa, problemin kaynağı her zaman uygulama loglarında yer almayabilir. Bu gibi senaryolarda uygulamanın arka planda sistemle nasıl etkileşim kurduğunu ve hangi kaynaklara erişmeye çalıştığını doğrudan gözlemlemek gerekir.

strace Ne İşe Yarar?

strace, bir uygulamanın işletim sistemiyle gerçekleştirdiği tüm sistem çağrılarını kaydeder ve görüntüler. Dosya erişimleri, ağ bağlantıları ve hata dönüşleri strace çıktısında açıkça görülebilir. Bu da uygulamanın hangi aşamada başarısız olduğunu anlamayı mümkün kılar.

strace ./uygulama komutu uygulamanın yaptığı tüm sistem çağrılarını listeler ve bu da çoğu zaman gereğinden fazla bilgi üretir. Bu nedenle doğrudan tüm çıktıyı incelemek yerine, hata ile sonuçlanan çağrılara odaklanmak daha verimli bir yaklaşımdır.

strace -e fault=all ./uygulama

Bu komut sayesinde yalnızca hata kodu dönen satırlar görüntülenir ve uygulamanın başarısız olduğu nokta hızlıca tespit edilebilir.

Dosya Erişimlerini İnceleyelim

Bir uygulama açılmıyorsa sorun çoğu zaman eksik veya yanlış konumlandırılmış bir dosyadan kaynaklanır. strace ile sadece dosya erişim çağrılarını izleyerek bu durumu hızlıca tespit edebiliriz.

strace -e trace=open,openat,access,stat,newfstatat ./uygulama

Aşağıdaki örnek çıktıda görüldüğü gibi,

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

ENOENT hatası, uygulamanın beklediği dosyayı bulamadığını ifade eder. Bu genellikle eksik konfigürasyon dosyaları veya yanlış tanımlanmış dosya yollarından kaynaklanır.

strace Çıktısını Dosyaya Kaydedelim

Uzun ve detaylı strace çıktıları terminal ekranında kaybolabilir. Çıktıyı bir dosyaya yönlendirmek, özellikle hata kodlarını ve tekrar eden çağrıları tespit ederken çok daha pratik bir yaklaşım sağlar.

strace -o hata.log ./uygulama

Eksik Dosya ve Kütüphane Kaynaklı Hataları İnceleyelim

Uygulamanın başlatılamaması çoğu zaman ihtiyaç duyduğu bir dosyaya erişememesiyle ilgilidir. ENOENT hata kodu, uygulamanın beklediği dosyanın sistemde bulunmadığını ifade eder.

grep -i ENOENT hata.log

Yetki Kaynaklı Sorunları Kontrol Edelim

Dosya mevcut olmasına rağmen erişilemiyorsa, bu durum genellikle izin problemlerine işaret eder. strace çıktısındaki EACCES hataları bu tür sorunları net şekilde ortaya koyar.

grep -i EACCES hata.log

Çalışan Serviste Takılma Durumları

Servis aktif görünmesine rağmen cevap vermiyorsa, sürecin bir noktada beklediği anlaşılır. Bunun için önce PID bilgisini tespit edelim.

ps aux | grep uygulama

Ardından çalışan sürece bağlanarak anlık sistem çağrılarını izleyelim.

strace -p 2451

lsof Nedir? strace ile Birlikte Neden Kullanılır?

strace, uygulamanın niyetini gösterir; yani hangi dosyaya veya porta erişmeye çalıştığını izlememizi sağlar. lsof ise bu erişimlerin sistem tarafında karşılığı olup olmadığını gösterir. Bir port gerçekten açık mı, bir dosya başka bir süreç tarafından mı kullanılıyor gibi sorular lsof ile netleşir. Bu nedenle hata ayıklama sürecinde strace ve lsof birlikte kullanıldığında çok daha sağlıklı sonuçlar elde 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

strace -p PID komutu çalışmıyor hata veriyor

strace, kernel seviyesinde izleme yaptığı için yeterli yetki gerektirir. Hata alınmasının en yaygın nedeni komutun sudo olmadan çalıştırılmasıdır. Komut mutlaka root yetkisiyle kullanılmalıdır.

Docker container içindeki uygulamalarda strace kullanımı mümkün mü?

Docker container içindeki bir uygulama strace ile izlenebilir ancak bunun için container’a SYS_PTRACE yetkisi verilmiş olması gerekir. Varsayılan Docker güvenlik ayarlarında bu yetki kapalıdır ve kernel seviyesinde izleme engellenir.

Ayrıca uygulamanın bağlantı kuramaması gibi sorunlar çoğu zaman container ağ yapılandırmasından kaynaklanır.

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