Linux Sistem Çağrılarını İzlemek için strace Nasıl Kullanılır

Yayınlanan: 2022-01-29
Bir dizüstü bilgisayarda stilize edilmiş bir terminal penceresi.
fatmawati achmad zaenuri/Shutterstock.com

Linux programları, çekirdekten kendileri için bazı şeyler yapmasını ister. strace komutu bu sistem çağrılarını ortaya çıkarır. Programların nasıl çalıştığını ve bazen neden çalışmadıklarını anlamak için bunları kullanabilirsiniz.

Çekirdek ve Sistem Çağrıları

Ne kadar akıllı olurlarsa olsunlar, bilgisayar programları her şeyi kendileri için yapamazlar. Kendileri için belirli işlevlerin yerine getirilmesi için talepte bulunmaları gerekir. Bu istekler Linux çekirdeğine gider. Tipik olarak, programın çağırdığı bir kitaplık veya başka bir yazılım arabirimi vardır ve kitaplık daha sonra çekirdeğe sistem çağrısı adı verilen uygun isteği yapar.

Bir programın yaptığı sistem çağrılarını ve yanıtların neler olduğunu görebilmek, ilginizi çeken veya yazdığınız programların iç işleyişini anlamanıza yardımcı olabilir. strace yaptığı budur. Sorunları gidermeye ve darboğazları aramaya yardımcı olabilir.

Bu, gdb gibi bir araçla bir uygulamada hata ayıklamakla aynı şey değildir. Hata ayıklama programı, bir programın dahili çalışmasını çalışırken araştırmanıza olanak tanır. Programınızın mantığında adım adım ilerlemenize ve belleği ve değişken değerlerini incelemenize olanak tanır. Karşılaştırıldığında, strace yaptığı, program çalışırken sistem çağrı bilgilerini yakalamaktır. İzlenen program sona erdiğinde, strace sistem çağrı bilgilerini terminal penceresine listeler.

Sistem çağrıları, dosyalar üzerinde okuma ve yazma eylemleri, sonlandırma süreçleri vb. gibi her türlü düşük seviyeli işlevsellik sağlar. Sistem çağrıları kılavuz sayfasında yüzlerce sistem çağrısının bir listesi var.

İLGİLİ: GDB ile Hata Ayıklama: Başlarken

strace yükleme

Eğer strace bilgisayarınızda kurulu değilse çok kolay bir şekilde kurabilirsiniz.

Ubuntu'da şu komutu kullanın:

 sudo apt kurulum yolu 

Fedora'da şu komutu yazın:

 sudo dnf kurulum strace 

Manjaro'da komut şudur:

 sudo pacman -Sy strace 

strace ile ilk adımlar

strace göstermek için küçük bir program kullanacağız. Fazla bir şey yapmaz: Bir dosyayı açar ve ona bir metin satırı yazar ve onu kontrol ederken herhangi bir hata yapmaz. strace ile kullanmak için bir şeyimiz olması için sadece hızlı bir hack.

 #include <stdio.h>

int main(int argc, char argv[]) { 

  // dosya tanıtıcısı 
  DOSYA * dosyaGeek;

  // "strace_demo.txt" adlı bir dosya açın veya oluşturun 
  fileGeek = fopen("strace_demo.txt", "w");

  // dosyaya bir metin yaz 
  fprintf(fileGeek, "Bunu dosyaya yaz" );

  // dosyayı kapat 
  fclose(fileGeek);

  // programdan çık 
  dönüş (0); 

} // ana bölümün sonu

Bunu "file-io.c" adlı bir dosyaya kaydettik ve gcc ile " st race ex ample" adlı stex adlı bir yürütülebilir dosyada derledik.

 gcc -o stex dosyası-io.c

Komut satırından strace arayacağız ve yeni yürütülebilir dosyamızın adını, izlemesini istediğimiz süreç olarak ona ileteceğiz. Linux komutlarından herhangi birini veya herhangi bir diğer ikili yürütülebilir dosyayı kolayca izleyebilirdik. Minik programımızı iki nedenden dolayı kullanıyoruz.

İlk sebep, strace ayrıntılı olmasıdır. Çok fazla çıktı olabilir. Öfke içinde strace kullandığınızda bu harika, ama ilk başta bunaltıcı olabilir. Minik programımız için sınırlı strace çıktısı var. İkinci neden, programımızın sınırlı işlevselliğe sahip olması ve kaynak kodunun kısa ve anlaşılır olmasıdır. Bu, çıktının hangi bölümlerinin programın dahili işleyişinin farklı bölümlerine atıfta bulunduğunu belirlemeyi kolaylaştırır.

 strace ./stex 

Açtığımız dosyaya “Write this to file” yazısını gönderen write sistem çağrısını ve exit_group sistem çağrısını net bir şekilde görebiliriz. Bu, uygulamadaki tüm iş parçacıklarını sonlandırır ve kabuğa bir dönüş değeri gönderir.

Çıktıyı Filtreleme

Basit tanıtım programımızla bile oldukça fazla çıktı var. -e (ifade) seçeneğini kullanabiliriz. Görmek istediğimiz sistem çağrısının adını ileteceğiz.

 strace -e ./stex yaz 

Reklamcılık

Birden fazla sistem çağrısını virgülle ayrılmış liste olarak ekleyerek raporlayabilirsiniz. Sistem çağrıları listesine herhangi bir boşluk eklemeyin.

 strace -e kapat, ./stex yaz 

Çıktıyı Dosyaya Gönderme

Çıktıyı filtrelemenin yararı, çıktıyı filtrelemedeki problemdir. Görmek istediğini görüyorsun ama başka bir şey görmüyorsun. Ve bu diğer çıktıların bir kısmı sizin için görmek istediğiniz şeylerden daha faydalı olabilir.

Bazen, her şeyi yakalamak ve tüm sonuç kümesini aramak ve kaydırmak daha uygundur. Bu şekilde, önemli bir şeyi yanlışlıkla hariç tutmazsınız. -o (çıktı) seçeneği, çıktıyı bir strace oturumundan bir metin dosyasına göndermenizi sağlar.

 strace -o trace-output.txt ./stex 

Daha sonra, listede gezinmek ve sistem çağrılarını veya başka herhangi bir şeyi ada göre aramak için less komutunu kullanabilirsiniz.

 daha az trace-output.txt 

Çıktıyı araştırmak için artık less 'nin tüm arama özelliklerini kullanabilirsiniz.

İLGİLİ: Linux'ta daha az Komut Nasıl Kullanılır

Zaman Damgası Ekleme

Çıktıya birkaç farklı zaman damgası ekleyebilirsiniz. -r (göreceli zaman damgaları) seçeneği, her ardışık sistem çağrısının başlangıcı arasındaki zaman farkını gösteren zaman damgaları ekler. Bu zaman değerlerinin, önceki sistem çağrısında harcanan zamanı ve bir sonraki sistem çağrısından önce programın yaptığı diğer her şeyi içereceğini unutmayın.

 strace -r ./stex 

Reklamcılık

Zaman damgaları, her çıktı satırının başında görüntülenir.

Her sistem çağrısında harcanan süreyi görmek için -T (sistem çağrısı süreleri) seçeneğini kullanın. Bu, her sistem çağrısı içinde harcanan süreyi gösterir.

 strace -T ./stex 

Süreler, her sistem çağrı hattının sonunda gösterilir.

Her sistem çağrısının ne zaman çağrıldığını görmek için -tt (mutlak zaman damgaları) seçeneğini kullanın. Bu, bir mikrosaniye çözünürlükle "duvar saati" zamanını gösterir.

 strace -tt ./stex 

Saatler her satırın başında görüntülenir.

Çalışan Bir Süreci İzleme

İzlemek istediğiniz işlem zaten çalışıyorsa, yine de ona strace ekleyebilirsiniz. Bunu yapmak için işlem kimliğini bilmeniz gerekir. Bunu bulmak için ps ile grep kullanabilirsiniz. Firefox'u çalıştırıyoruz. firefox işleminin kimliğini bulmak için ps kullanabilir ve grep aracılığıyla aktarabiliriz.

 ps -e | grep firefox 

Reklamcılık

İşlem kimliğinin 8483 olduğunu görebiliriz. strace hangi işlemin ekleneceğini söylemek için -p (işlem kimliği) seçeneğini kullanacağız. sudo kullanmanız gerekeceğini unutmayın:

 sudo strace -p 8483 

strace kendisini işleme eklediğine dair bir bildirim göreceksiniz ve ardından sistem izleme çağrıları her zamanki gibi terminal penceresinde görüntülenecektir.

Rapor Oluşturma

-c (yalnızca özet) seçeneği, strace bir rapor yazdırmasına neden olur. İzlenen program tarafından yapılan sistem çağrıları hakkında bilgi için bir tablo oluşturur.

 strace -c ./stex 

Sütunlar:

  • % time : Her sistem çağrısında harcanan yürütme süresinin yüzdesi.
  • saniye : Her sistem çağrısında harcanan saniye ve mikrosaniye cinsinden ifade edilen toplam süre.
  • usecs/call : Her sistem çağrısında harcanan mikrosaniye cinsinden ortalama süre.
  • çağrılar : Her sistem çağrısının yürütülme sayısı.
  • hatalar : Her sistem çağrısı için hata sayısı.
  • syscall : Sistem çağrısının adı.

Bu değerler, hızla yürütülen ve sonlandırılan önemsiz programlar için sıfırları gösterecektir. Gösteri uygulamamızdan daha anlamlı bir şey yapan programlar için gerçek dünya değerleri gösterilir.

Derin Görüşler, Kolayca

strace çıktısı, hangi sistem çağrılarının yapıldığını, hangilerinin tekrar tekrar yapıldığını ve çekirdek tarafı kodunda ne kadar yürütme süresi harcandığını gösterebilir. Bu harika bir bilgi. Çoğu zaman, kodunuzun içinde neler olup bittiğini anlamaya çalışırken, ikili dosyanızın birçok işlevini yerine getirmek için çekirdekle neredeyse kesintisiz olarak etkileşime girdiğini unutmak kolaydır.

strace kullanarak, resmin tamamını görürsünüz.

İLGİLİ: Geliştiriciler ve Meraklılar için En İyi Linux Dizüstü Bilgisayarlar