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ırMaalesef
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());
}
}
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. –
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