2013-12-10 15 views
5

Abbiamo un'applicazione multi-processo in cui il debug di uno specifico processo figlio si sta rivelando difficile. A causa dei timeout di messaggistica tra i processi, non abbiamo il tempo di collegare gdb al figlio di destinazione, quindi mi chiedevo se posso interrompere un processo tramite un probe systemtap?È possibile arrestare un processo tramite un probe systemtap in modo da poter allegare gdb?

Una sonda semplice dovrebbe, a mio avviso, essere necessario, ad esempio .:

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

Purtroppo, quanto sopra non sta compilando ... tutte le idee?


Io non sono un esperto di systemtap, quindi questo non è probabilmente la soluzione migliore, ma qui è la mia soluzione grezza per chiunque sia interessato:

#!/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

Si consiglia di avviare il processo con processo figlio singolo. Sarà più facile iniziare con un figlio singolo invece di creare più copie, quindi scrivere un gestore per fermarli .. –

+0

Rachit Jain; grazie per il suggerimento, ma sfortunatamente non è un'opzione - avrebbe reso le cose molto più semplici. Un'altra alternativa che posso provare per interesse è lldb, che si avvia e può attaccare molto più velocemente di gdb can (ma mi sto attaccando con la risposta di fche per il mo). – mrtimdog

risposta

5

vedi funzione dell'uomo :: raise (3stap) , nuovo da systemtap 2.3 (2013-07-25).

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

È necessaria la modalità Guru per consentire allo script di utilizzare questa funzione.

+0

Eccellente, grazie mille - questo è esattamente quello che cercavo :) Stavo cercando di impostare gli stati delle attività per thread tramite set_task_state (...), ma stranamente non funzionava in quanto non dire al kernel cosa sto cercando di fare. Non ho idea del perché non abbia pensato di uccidere (...) le alternative, cioè aumentare (...) !! Grazie! – mrtimdog

+1

Doh! Avevo letto subito un aumento nei documenti! ... "function :: raise - alza un segnale nel thread corrente" :) – mrtimdog

Problemi correlati