Ho bisogno di stampare la traccia dello stack da un gestore di segnale dell'applicazione C++ multi-threaded a 64 bit in esecuzione su Linux. Sebbene abbia trovato diversi esempi di codice, nessuno di essi viene compilato. Il mio punto di blocco è ottenere l'indirizzo del chiamante (il punto in cui il segnale è stato generato) dalla struttura ucontext_t. Tutte le informazioni che sono riuscito a trovare, indicano il registro EIP come ucontext.gregs [REG_EIP] o ucontext.eip. Sembra che entrambi siano specifici per x86. Ho bisogno di un codice conforme a 64 bit per CPU Intel e AMD. Qualcuno può aiutare?Stampa traccia dello stack da un gestore di segnale
risposta
Il solito modo di ottenere una traccia dello stack è quello di prendere l'indirizzo di una variabile locale , quindi aggiungere un po 'numero magico ad esso, a seconda di come il compilatore genera codice (che può dipendere dalle opzioni di ottimizzazione utilizzati per compilare il codice) e tornare da lì. Tutto molto sistema dipendente, ma fattibile se sai cosa stai facendo.
Se questo funziona in un gestore di segnale è un'altra domanda. Io non sono a conoscenza della piattaforma che descrivi, ma molti sistemi installano uno stack separato per i gestori di segnale, senza alcun collegamento allo stack interrotto nella memoria accessibile all'utente.
Vuoi dire che non ci sono collegamenti allo stack interrotto? –
@wood_brian Non nella memoria accessibile all'utente. (Il sistema operativo ovviamente mantiene le informazioni in qualche modo.) –
Hai scritto un'interruzione statica. Pensavo intendessi uno stack interrotto. –
c'è una funzione glibc backtrace. La pagina man riporta un esempio della chiamata:
#define SIZE 100
void myfunc3(void) {
int j, nptrs;
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
Vedere la pagina man per più contesto.
è difficile dire se questo è davvero garantito per funzionare da un gestore di segnale, dal momento che Posix elenca solo alcune funzioni rientranti che sono garantite per funzionare. Ricorda: un gestore di segnale può essere chiamato mentre il resto del processo è nel bel mezzo di una chiamata malloc.
Il mio indovinare è che questo di solito funziona, ma potrebbe non riuscire di volta in volta. Per il debug questo può essere abbastanza buono.
- 1. Log.e non stampa la traccia dello stack di UnknownHostException
- 2. traccia dello stack python di stampa senza sollevare nessuna eccezione
- 3. Stampa i valori dei parametri sulla traccia dello stack
- 4. Stampa di una traccia di stack da un'altra discussione
- 5. Traccia dello stack nativo su ICS?
- 6. Ottenere traccia dello stack su Android NDK
- 7. Individuazione della traccia dello stack effettivo Java da una traccia stack javascript
- 8. Dov'è finita la traccia dello stack?
- 9. Come trovare questa traccia dello stack?
- 10. Hai bisogno di aiuto decifrare un C# traccia dello stack
- 11. Stampa traccia di stack nella finestra di output
- 12. Accesso ai dati condivisi da un gestore di segnale
- 13. Come forzare VM di pitone per stampare una traccia dello stack?
- 14. Stampa una traccia dello stack su stdout sugli errori in Django durante l'utilizzo di manage.py runserver
- 15. Ottieni i valori dei parametri nella traccia dello stack
- 16. Traccia origini segnale UNIX?
- 17. Django: manage.py non stampa la traccia stack per errori
- 18. Errore di traccia stack
- 19. Nessuna traccia di stack da NSAssert
- 20. Problemi di visualizzazione della traccia dello stack C# in WinDbg
- 21. Numeri di riga errati nella traccia dello stack (release)
- 22. Come stampare traccia dello stack nel file di log
- 23. Ottieni traccia dello stack corrente in Ruby senza generare un'eccezione
- 24. Lua: Come chiamare l'errore senza traccia dello stack
- 25. Un modo semplice per stampare la traccia dello stack corrente di un'app?
- 26. Gestore segnale SIGKILL
- 27. Che cosa significa "bloccato" in una traccia dello stack Java?
- 28. Ottenere la traccia dello stack completo dalla sessione remota
- 29. Come mostrare la traccia dello stack completo su eclipse?
- 30. Che cosa significa __forwarding__ nella traccia dello stack?
Non mi sorprenderebbe se non fosse possibile farlo. Hai provato a farlo su 32 bit? Inoltre, quale distro? –
In 64 bit il registro è RIP. Abbastanza sicuro che sarà lì da qualche parte. –
È Red Hat 4.1.2-50. Non può essere un'applicazione a 32 bit poiché lavoriamo con grandi aree di memoria fino a 60+ GB – GMichael