2011-12-05 5 views
7

Esiste un modo per stampare la traccia dello stack di runtime di un processo Ruby 1.9.x? So che c'era un'utilità chiamata pstack per Ruby 1.8, ma il progetto sembra essere stato abbandonato un paio di anni fa: https://github.com/ice799/pstack. Esiste qualcosa come questo per Ruby 1.9? Molte grazie!Come posso stampare la traccia dello stack in runtime di un processo Ruby 1.9?

EDIT: Sono interessato all'utilizzo di uno strumento esterno per generare la traccia dello stack (non in esecuzione nello stesso spazio di memoria del processo Ruby).

Come ha sottolineato @mosch, il metodo Kernal#caller funziona dal processo Ruby in esecuzione.

Si potrebbe anche costruire a supporto al tuo codice Ruby che intrappola segnali di processo e stampa una traccia dello stack:

Signal.trap("SIGTERM") { p caller } 

Riferimento: http://www.ruby-doc.org/core-1.9.3/Signal.html

ho potuto costruire questa funzionalità nel mio codice, ma sono Preferisco usare una soluzione esterna più generalizzata. Grazie.

risposta

3

Ogni volta che si chiama il metodo Kernel caller, si otterrà lo stack di chiamate corrente come matrice.

+0

Grazie @mosch. Ho aggiornato la mia descrizione per aggiungere alcuni chiarimenti. –

0

Oggi mi è venuta un'idea. Il pstack di ice799 ha approfittato di gdb per chiamare una funzione interna di ruby ​​per scaricare il backtrace. Tuttavia, non ha funzionato per 1.9 e ha richiesto una patch. Non è così conveniente.

Con un po 'di fortuna, abbiamo hotpatch questo potente strumento. Può iniettare un file .so in un processo in esecuzione, possiamo aggiungere la funzione richiesta tramite .so injection, pstack farà tutto il resto. Ovviamente l'iniettato deve essere compatibile con il nucleo in rubino corrente, ma possiamo supporre che questa parte sia molto stabile ora.