Linux'taki “truss -T” ve “truss -U” nun eşdeğeri mi?


12

Solaris yardımcı programının -Tve -Useçeneğinin trussLinux'ta yaptıklarına eşdeğer bir şey var mı ?

Bunlar , izlenen uygulama tarafından çağrıldığında durmasına neden olacak bir sistem çağrısı ( -T) veya kütüphane işlevi ( -U) belirtmelidir .

Ya da, aksi takdirde, izlenen bir uygulama tarafından başlatılan herhangi bir işlemin (SIGSTOP tarafından öldürülmüş gibi) belirli bir sistem çağrısı veya belirli bir paylaşılan kütüphane işlev çağrısı yapar yapmaz durdurulmasını istiyorum.

straceve ltraceLinux'ta Solaris'in özelliklerinin çoğunu sağlar truss, ancak bunu yapmıyorlar.

Örneğin:

truss -f -T open cmd

Gibi olurdu strace -f cmddışında o süreci yürütme eğer cmdya onun soyundan birini yapan opensistem çağrısı, hemen durdurulmalı olurdu (ve benim kolaylık daha sonra devam ettirebilirsiniz)

Bazı durumlarda, gdb's kullanabilirdim catch syscall, ama çatalları rahatça takip edebilen ve tüm çatallı süreçler için yapmaya devam edebilen ve execves sonra bile yapmaya devam edebilen bir çözüm arıyordum .

Bazı işlevselliğin bazı olayları arasında tek adımlık uygulamalara aynı işlevselliği, hatta bir (veya aynı yardımcı programa seçenekler) veren bazı yardımcı programları hatırlıyorum, ancak belleğim beni başarısız yapıyor, emin olamıyorum bile Linux'taydı.


1
Sorunuza gerçekten bir cevap değil, ancak gdb'nin çatalları takip etmek için bazı seçenekleri var, sadece bir yürütmeyi kapatmıyor. Yine de bir seferde sadece bir işlem yapar, bu da strace benzeri işlevsellik arıyorsanız muhtemelen bir anlaşma kırıcıdır, ancak her ihtimale karşı bahsettiğimi düşündüm.
Bratchley

@JoelDavis, teşekkürler. Ve exec sonra da takip edebilir gibi görünüyor, ( follow-exec-mode), ben bunu deniyorum. Soruyu kesinlikle cevaplamıyor, ancak ihtiyacım olan şey için yeterince iyi olabilir.
Stéphane Chazelas

Sorunuzu anlarsam, belirli bir sinyal görünene kadar izlemenin bir yolunu arıyorsanız ve izlemeyi durdurun, izlediğiniz uygulamayı herhangi bir şekilde durdurmayın veya öldürmeyin, değil mi?
slm

@slm, hayır, izlenen bir uygulama tarafından başlatılan bir işlemin (SIGSTOP tarafından öldürülmüş gibi) belirli bir sistem çağrısı yapılır yapılmaz durdurulmasını istiyorum. Solaris trusskılavuzuna bir bağlantı ekledim .
Stéphane Chazelas

Doğru anladığımdan emin olalım. Belirli bir sistem çağrısı yaptığında bir işlemi durdurmanın bir yolunu istiyorsunuz. Bu doğru mu?
sparticvs

Yanıtlar:


3

Bildiğim kadarıyla bu yapılamaz strace, ptracedahili olarak kullanılan işlev SIGSTOPveya SIGINTçağrılarda kullanılır.

DÜZENLE:

Bu basit çözümü ministrace'e yerleştirdim , bu yüzden kodlamaya gerek yok.

Benim önerilen çözüm, eğer strace tüm işlevselliği gerekli değilse, burada buldum ministrace değiştirmek olacaktır - Bu kendinize 70 kod satırında bir strace yazın .

Tek seferlik bir programda aşağıdaki koddan önce iki satır ekleyebilirsiniz:

if (wait_for_syscall(child) != 0) break;

Sahte kod:

if(syscall == SYS_write)
    do {
        char str[4];
        gets(str);  // waits until enter to continue    
    } while(0);

Bunların hiçbirini tespit etmedim, bu son adımlar size bırakıldı.


Teşekkürler. Çalışır ve bu bağlantı çok faydalıdır. Ancak (anlaşılabilir bir şekilde birkaç kod satırında), gdb / strace'nin yaptığı arg çözme işlemini yapmaz, bu yüzden amacım için yararlı olmazdı. Kolayca yapıldığını gösterir. Sonunda gdb için gittim ama bu özellik için yamalama şeridi nispeten kolay olacak gibi görünüyor. Bunu yapmak için mevcut bir komut olduğundan şüphelendiğim gibi soruyu açık bırakmak. Zamanı geldiğinde python-ptrace'a bakacağım.
Stéphane Chazelas

Rica ederim! Uygulamayı genişletme konusunda biraz çılgına döndüm, bu yüzden sistem çağrısına kimliğe ve isme referans vermek mümkün olacaktır. Yine ptrace ile oynamak eğlenceliydi.
Daniël W. Crompton

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.