2011-09-02 16 views
13

Başka bir işlemin iş parçacıklarını gözlemlemek için ptrace içeren bir linux uygulaması üzerinde çalışıyorum. Gözlemlediğim uygulama çocuk süreçlerini çatalladığında, bu zaten çok iyi çalışıyor. Tüm çocukların ben kurulumunu takip etmek içinptrace ve dişler

  • SIGSTOP formu alt süreç
  • SIGTRAP ebeveyn

den: my uygulamada waitpid'nin arayarak ben gözlemleyerek uygulamada aşağıdaki sinyalleri elde edebilirsiniz PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONE ve PTRACE_O_TRACEEXIT ile ptrace.

Her şey çocuk süreçlerinde oldukça iyi çalışıyor olsa da, uygulamanın iş parçacıklarını gözlemleyemiyorum. İş parçacığı oluşturma işleminden SIGTRAP aldım ancak iş parçacığından herhangi bir sinyal alamıyorum.

ptrace ile ilgili özel bir şey var mı? strace, iş parçacığını nasıl izler (strace kodundaki iş parçacıklarına özel herhangi bir özel yordam bulamadım)? Sonra ptrace(PTRACE_ATTACH, pid, NULL, NULL);

  • Ben waitpid() çağırır: Bir işlemi eklemek

    • Birinci: trace_pid = waitpid(-1, &status, 0);
    • Set ptrace seçenekleri: ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

    Bu benim uygulamada ptrace nasıl kullanılacağı

    Pid'e iliştirdikten sonra bir döngüde waitpid() numaralı telefonu arıyorum ve'u arayın. ptrace tarafından bildirilen her yeni görev için. Tabii ki, olay işleme sonrası SIGCONT ile görevlerine devam ediyorum.

  • +1

    arayarak tüm parçacıkları gelen sinyalleri var Sorunun özü: Yeni bir iplik oluşturulduğunda, gözlem sürecindeki sigstop'u bile alamıyorum. Ancak, ptrace documentatio'da şöyle diyor: "otomatik olarak SIGSTOP ile başlayacak yeni klonlanmış süreci izlemeye başlıyor." Bu nasıl olabilir? – mupro

    +0

    Procfs ve posix konuları kullanarak küçük bir uygulama kullanarak biraz daha araştırma yaptım. Tüm uygulama, yeni bir iş parçacığı başlatmak ve bir süre uyumaktır. Yeni iş parçacığı da birkaç saniye uyuyor. Dediğim gibi, yeni iş parçacığı için waitpid ile bir sigstop almamıştım. Yeni evre için procfs durum dosyası beni anlatıyor Ancak: Adı: thread_test Devlet: t (aydınger durdur) Tgid: 2538 Pid: 2545 ppid: 2395 TracerPid: 2540 Yani yeni iplik durdu ama waitpid stop sinyalini alamaz. Konu izlemenin doğru yolu nedir? – mupro

    cevap

    13

    Son olarak, kendimi çözüm buldum: Ben biraz daha yakın geldiğimizi düşünüyorum

    waitpid(-1, &status, __WALL) 
    

    yerine

    waitpid(-1, &status, 0)