2013-12-10 25 views
5

Belirli bir alt işlemin hata ayıklaması zor olduğu çok işlemli bir uygulamamız var. Süreçler arasındaki mesajlaşma zaman aşımları nedeniyle hedef çocuğa gdb eklemek için zamanımız yok, bu yüzden bir süreci sistemli bir probla durdurabilir miyim diye merak ediyordum?Bir proses bir sistemtap probu ile durdurulabilir, böylece gdb eklenebilir mi?

Basit sonda sanırım, mesela .: gerekli olmalıdır

Maalesef

probe process("exeName").mark("STOP_HERE") 
{ 
    force_sig(SIGSTOP, current); 
} 

, yukarıda ... derleme değil herhangi bir fikir?


Bir SystemTap'ı uzmanı değilim, bu yüzden bu muhtemelen en iyi çözüm değildir, ama burada ilgilenen herkes için benim ham çözüm:

#!/bin/stap -g 

global gdbRunning = 0; 

probe process(@1).mark(@2) 
{ 
    raise(%{ SIGSTOP %}); 

    gdbCmd = sprintf("cgdb -- -q -ex 'thread find %d' %s %d", tid(), @1, pid()); 

    if (gdbRunning == 0) 
    { 
     gdbRunning = 1; 
     printf("STOP PID %d TID %d [%s]\n", pid(), tid(), gdbCmd); 
     system(gdbCmd); 
    } 
    else 
    { 
     printf("STOP PID %d TID %d\n", pid(), tid()); 
    } 
} 
+0

Prosesinizi tek çocuk süreçleriyle başlatmanızı tavsiye ederim. Tek bir çocukla başlamak daha kolay olacaktır, daha sonra onları durdurmak için bir işleyici yazınız. –

+0

Rachit Jain; öneri için teşekkürler, ama bu maalesef bir seçenek değil - işleri daha kolay hale getirebilirdi. İlgilendiğim başka bir alternatif de lldb'dir ve bu da gdb kutusundan çok daha hızlı bir şekilde çalışmaya başlar (ancak mo için cevap veririm). – mrtimdog

cevap

5

bakın adam fonksiyonu :: zam (3stap) , sistemtap 2.3'ten itibaren yeni (2013-07-25).

stap -g -e 'probe WHATEVER { raise(%{ SIGSTOP %}) }' 

Komut dosyanızın bu işlevi kullanmasına izin vermek için guru moduna ihtiyacınız vardır.

+0

Mükemmel, çok teşekkür ederim - bu tam olarak neyim peşindeyim :) sillilly, set_task_state (...) aracılığıyla iş parçacığı başına görev durumlarını ayarlamaya çalışıyordum, ancak garip bir şekilde işe yaramadı. Çekirdeğe ne yapmaya çalıştığımı söyle. Neden öldürme (...) alternatiflerini düşünmediğimi, yani yükseltmeyi (...) düşünemedim! Teşekkürler! – mrtimdog

+1

Doh! Dokümanlardaki düz zammı okudum! ... "function :: zam - mevcut konuya bir sinyal yükseltmek" :) – mrtimdog

İlgili konular