Linux üzerinde çalışan programlar, işletim sistemi tarafından yönetilen kaynakları kullanmak istediğinde (dosya okuma, süreç oluşturma vb.), işletim sistemine sistem çağrıları yapar. Sistem çağrıları, çekirdek düzeyinde çalışır ve gerekli işlemleri gerçekleştirerek kontrolü çağıran programa bırakır. strace aracı, bu sistem çağrılarını Linux'ta izleme yeteneği sağlar.
strace Komutunun Tipik Kullanımı
Bir uygulama için sistem çağrılarını izlemek için, komutu ile çağırmanız yeterlidir. iz aşağıdaki biçimde:
dizi ls /tmp
Ancak, genellikle çok daha erken başlayan ve arka planda çalışmaya devam eden süreçler vardır. Herhangi bir sorun nedeniyle, bu tür işlemlerle ilgili ek bilgiler toplamak isteyebilirsiniz. ekleyebilirsin iz işlemin işlem kimliğini vererek çalışan herhangi bir uygulamaya -p parametre:
strace -p 2759
Çıktı:
Bir Uygulamanın Konularını ve Çatallarını Takip Edin
strace ile, uygulamanın çatalı olan tüm iş parçacıklarını ve diğer alt süreçleri aşağıdakileri kullanarak kontrol edebilirsiniz. -f bayrak.
strace -f -p 2759
Çıktı:
strace ile Bazı Sistem Çağrılarını Kontrol Edin
Varsayılan strace çıktısı, zaman zaman takip etmek için oldukça kalabalık olabilir. Yalnızca belirli sistem çağrılarını izlemek istiyorsanız, bunu -e parametre:
strace -f -e trace=aç, yaz, kapat, bağla,seçme -p 19770
Yalnızca dosya işlemleriyle ilgili sistem çağrılarını izlemek için şunu kullanın: -e iz=dosya:
strace -e iz=dosya -p 19770
Yalnızca ağla ilgili sistem çağrılarını filtrelemek için şunu belirtin: -e iz=ağ komutta:
strace -e iz=ağ -p 19770
Saniyeler İçinde Zaman Bilgisi Alın
Sistem çağrılarının çıktısını alırken, -t saniye cinsinden hassas zaman bilgisi almak için parametre. Çoğu zaman hassasiyet ihtiyaçlarınız için yeterli olmayacaktır. Bu gibi durumlarda kullanabilirsiniz. -tt mikrosaniye hassasiyetinde zaman bilgisi almak için parametre:
strace -tt ls /tmp
Sistem Çağrıları Hakkında İstatistik Toplayın
İle -c parametresini kullanarak sistem çağrıları hakkında istediğiniz kadar istatistik toplayabilirsiniz:
strace -f -c -p 19770
Günlükleri Bir Dosyaya Kaydet
strace'i uzun süre çalıştırırsanız ve elde edilen günlükleri daha sonra daha ayrıntılı incelemek isterseniz, günlükleri kaydetmeniz gerekir. İle -Ö parametre ile günlükleri kaydetmesi gereken dosyayı belirtebilirsiniz:
strace -f -o /tmp/strace.log -e iz=dosya ls /tmp
ptrace Engelleme İşlemi
prctl sistem çağrısını kullanarak, Linux altındaki herhangi bir uygulama, ptrace kullanan kök olmayan kullanıcılar tarafından kontrol edilmesini engelleyebilir. Uygulama silinirse PR_SET_DUMPABLE prctl üzerinden kendi kendine flag oluşturduğunda, root dışındaki kullanıcılar, uygulamaya sinyal gönderme hakkına sahip olsalar bile, bu uygulamayı ptrace ile kontrol edemezler.
Bu özelliğin en tipik kullanımlarından biri OpenSSH kimlik doğrulama aracısı yazılımında görülür. Böylece uygulamanın başka bir uygulama tarafından kontrol edilmesi ptrace kullanıcı kimlik doğrulamasında engellenir.
ptrace ve Güvenlik
Geleneksel Linux süreç modelinde ayarlanan ptrace olanağı sayesinde, sisteminizde kullanıcınızla birlikte çalıştırdığınız herhangi bir yazılım, içine kötü amaçlı kod ekleme yetkisine sahiptir. En basit xterm aracından gelişmiş web tarayıcı uygulamaları, bu tür kötü amaçlı yazılımlar - ptrace sistem çağrısı sayesinde - çalışan diğer tüm uygulamalarınızın kontrolünü ele geçirebilir ve siz fark etmeden önemli bilgileri kopyalayabilir.
Pek çok kullanıcının farkında olmadığı bu duruma karşılık olarak adlandırılan güvenlik modülü ile bir koruma mekanizması geliştirilmiştir. Linux çekirdeğinde Yama.
Ptrace sistem çağrısına verilen yanıtı şuradan kontrol edebilirsiniz: /proc/sys/kernel/yama/ptrace_scope dosya. Varsayılan olarak, bu dosya 0 değerini yazar.
Aşağıdaki değerler kabul edilebilir:
Değer | Anlam |
0 | geleneksel davranış: Hakkı olan tüm uygulamalar ptrace kontrol edilebilir. |
1 | Kısıtlı izleme: Yalnızca uygulamanın doğrudan ebeveyni veya uygulama tarafından izin verilen hata ayıklama uygulamaları PR_SET_PTRACER seçeneği kontrole sahiptir. Böylece, kullanımları gdb program_adı ve strace program_adı çalışmaya devam edecek, ancak daha sonra çalışan bir uygulama ekleyemezsiniz. |
2 | Sistem yöneticisine Ptrace: Yalnızca tanımlı uygulamalar CAP_SYS_PTRACE tanımlayan özellik veya alt süreçler PTRACE_TRACEME ile seçenek prctl kontrol edilebilir. |
3 | Tamamen devre dışı: Numara ptrace her koşulda izin verilir. Bu özellik bir kez tanımlanmışsa, çalışma zamanında tekrar değiştiremezsiniz. |
Pek çok geliştirici, uygulamaların, kök kullanıcı dışında, prctl aracılığıyla kendilerinin ptrace'i devre dışı bırakabileceğini bilmiyor. Her ne kadar OpenSSH aracısı gibi güvenlikle ilgili yazılımlar bu işlemleri gerçekleştirse de sistem üzerinde çalışan tüm yazılımlardan aynı davranışı beklemek doğru olmaz.
Son günlerde, bazı Linux dağıtımları varsayılan değerini ayarlamaya başladınız. ptrace_scope dosya, yukarıda açıklanan 1. Böylece ptrace işlemleri kısıtlanarak sistem genelinde daha güvenli bir çalışma ortamı sağlanır.
Örnek bir strace kullanma
Aşağıdaki örnek uygulamayı adıyla kaydedin ministrace.c. Ardından aşağıdaki komutla derleyebilirsiniz:
gcc-Öbakanlıkbakanlık.c
Kod:
#Dahil etmek <sys/ptrace.h>
#Dahil etmek <sistem/reg.h>
#Dahil etmek <sistem/bekle.h>
#Dahil etmek <sys/types.h>
#Dahil etmek <unistd.h>
#Dahil etmek <stdlib.h>
#Dahil etmek <stdio.h>
#Dahil etmek <hata.h>
#Dahil etmek <dize.h>
intwait_for_syscall(pid_t çocuğu)
{
int durum;
süre (1) {
ptrace (PTRACE_SYSCALL, alt, 0, 0);
waitpid (çocuk, &durum, 0);
if (WIFSTOPPED(durum) && WSTOPSIG(durum) & 0x80)
dönüş0;
if (WIFEXITED(durum))
dönüş1;
}
}intdo_child(int argc, karakter **argv)
{
karakter *args [argc+1];
memcpy (args, argv, argc * sizeof(karakter*));
argümanlar[argc] = BOŞ;
ptrace (PTRACE_TRACEME);
öldürmek(getpid(), SIGSTOP);
dönüş execvp (arglar[0], bağımsız değişkenler);
}intdo_trace(pid_t çocuğu)
{
int durum, sistem çağrısı, geri alma;
waitpid (çocuk, &durum, 0);
ptrace (PTRACE_SETOPTIONS, alt, 0, PTRACE_O_TRACESYSGOOD);
süre(1) {
Eğer (wait_for_syscall (alt) != 0) kırmak;sistem çağrısı = ptrace (PTRACE_PEEKUSER, alt, sizeof(uzun)*ORIG_RAX);
fprintf (stderr, "sistem çağrısı(%d) = ", sistem çağrısı);Eğer (wait_for_syscall (alt) != 0) kırmak;
retval = ptrace (PTRACE_PEEKUSER, alt, sizeof(uzun)*RAX);
fprintf (stderr, "%d
", geri dönüş);
}
dönüş0;
}
intana(int argc, karakter **argv)
{
eğer (argc < 2) {
fprintf (stderr, "Kullanım: %s prog argümanları
", argv[0]);
çıkış(1);
}
pid_t çocuk = çatal();
if (alt == 0) {
dönüş do_child (argc-1, bağımsız +1);
} başka {
dönüş do_trace (alt);
}
}
Uygulamayı derledikten sonra herhangi bir komutu çalıştırabilirsiniz. bakanlık ve çıktıyı inceleyin:
Strace'yi Birçok Amaç İçin Kullanabilirsiniz
strace, sistem kaynaklarını gereksiz yere kullanan programlardaki hataları bulmaya yardımcı olabilir. Aynı şekilde bir programın işletim sistemi kaynaklarını kullanırken sergilediği özellik de strace ile ortaya konulabilir.
strace, sistem çağrılarını doğrudan dinlediğinden, çalıştırılan programın kodunun açık/kapalı olup olmadığına bakılmaksızın çalışma zamanı dinamiklerini ortaya çıkarabilir. strace kullanmaya başlayınca programların neden hata verdiği hakkında fikir edinmek mümkündür.
Benzer şekilde, strace bir programın neden beklenmedik bir şekilde sonlandırıldığını anlamanıza yardımcı olur. Bu nedenle, Linux çekirdeği geliştirme ve sistem yönetiminde strace'e aşina olmak çok önemlidir.
Sıfırdan Linux İle Kendi İşletim Sisteminizi Oluşturun [Linux]
Sonrakini Oku
İlgili konular
- Linux
- Linux Komutları
- Linux çekirdeği
Yazar hakkında

Matematik ve teknolojinin hayranı olan bir mühendis ve yazılım geliştiricisi. Bilgisayarları, matematiği ve fiziği her zaman sevmiştir. Oyun motoru projelerinin yanı sıra makine öğrenimi, yapay sinir ağları ve lineer cebir kütüphaneleri geliştirmiştir. Ayrıca makine öğrenmesi ve lineer matrisler üzerinde çalışmalarını sürdürmektedir.
Haber bültenimize abone ol
Teknik ipuçları, incelemeler, ücretsiz e-kitaplar ve özel fırsatlar için bültenimize katılın!
Abone olmak için buraya tıklayın