Ho bisogno di ottenere le informazioni sullo stack della mia applicazione C in determinati punti. Ho letto la documentazione e ho cercato in rete, ma non riesco ancora a capire come posso farlo. Puoi indicare una semplice spiegazione del processo? O, ancora meglio, per un esempio di svolgimento dello stack. Ne ho bisogno per HP-UX (Itanium) e Linux.Stack di riavvolgimento su HP-UX e Linux
risposta
Partenza linux/stacktrace.h
Ecco un riferimento API:
http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html
dovrebbe funzionare su tutti i kernel Linux
Ecco un esempio alternativo in C da
http://www.linuxjournal.com/article/6391
#include <stdio.h>
#include <signal.h>
#include <execinfo.h>
void show_stackframe() {
void *trace[16];
char **messages = (char **)NULL;
int i, trace_size = 0;
trace_size = backtrace(trace, 16);
messages = backtrace_symbols(trace, trace_size);
printf("[bt] Execution path:\n");
for (i=0; i<trace_size; ++i)
printf("[bt] %s\n", messages[i]);
}
int func_low(int p1, int p2) {
p1 = p1 - p2;
show_stackframe();
return 2*p1;
}
int func_high(int p1, int p2) {
p1 = p1 + p2;
show_stackframe();
return 2*p1;
}
int test(int p1) {
int res;
if (p1<10)
res = 5+func_low(p1, 2*p1);
else
res = 5+func_high(p1, 2*p1);
return res;
}
int main() {
printf("First call: %d\n\n", test(27));
printf("Second call: %d\n", test(4));
}
Si desidera guardare libunwind - questa è una libreria multipiattaforma sviluppato originariamente da HP per rilassarsi tracce di stack Itanium (che sono particolarmente complessi); ma successivamente è stato esteso a molte altre piattaforme; inclusi sia x86-Linux che Itanium-HPUX.
Dalla pagina man di libunwind (3); ecco un esempio di utilizzo libunwind scrivere una funzione tipica 'mostra backtrace': lavoro
#define UNW_LOCAL_ONLY
#include <libunwind.h>
void show_backtrace (void) {
unw_cursor_t cursor; unw_context_t uc;
unw_word_t ip, sp;
unw_getcontext(&uc);
unw_init_local(&cursor, &uc);
while (unw_step(&cursor) > 0) {
unw_get_reg(&cursor, UNW_REG_IP, &ip);
unw_get_reg(&cursor, UNW_REG_SP, &sp);
printf ("ip = %lx, sp = %lx\n", (long) ip, (long) sp);
}
}
Questo shoulw per HPUX Itanium: http://docs.hp.com/en/B9106-90012/unwind.5.html
Per semplice stack, provare U_STACK_TRACE().
- 1. Che cos'è lo stack Linux?
- 2. SSL su stack di servizio
- 3. Riavvolgimento: b e: e in evil-normal-state-map
- 4. Stato iniziale dei registri di programma e stack su Linux ARM
- 5. Emacs: come si disabilita il riavvolgimento automatico?
- 6. compilazione su windows e linux
- 7. unistd.h e C99 su Linux
- 8. killproc e pidofproc su linux
- 9. Puntatore allo stack pseudo-casuale sotto Linux?
- 10. Creazione di C++ su Windows e Linux
- 11. Domande su pieghe e overflow dello stack
- 12. prestazioni Socket su Linux
- 13. implementazione di sondaggi su linux e implementazione sondaggio su solaris
- 14. Esempio di stack eseguibile in Linux (architettura i386)
- 15. Segue di riavvolgimento in Xcode 6.1.1 con storyboard
- 16. su Linux
- 17. Differenza tra "stack di chiamate" e "stack di thread"
- 18. Aumenta le dimensioni dello stack in Linux con setrlimit
- 19. Python Wheels su Linux (come? E perché?)
- 20. malloc_size alternativa su Linux e Windows
- 21. Informazioni su Python Terminale Unicode e Linux
- 22. Stack e scope C++
- 23. Posso ottenere lo stack delle chiamate Python con linux perf?
- 24. Profili di prestazioni su Linux
- 25. Debug leggero su Linux embedded
- 26. Utilizzo di ios_webkit_debug_proxy su linux
- 27. Lavorare su stack di trasformatori monad permutati
- 28. Xcode - Traccia stack di chiamata su assert?
- 29. Stampa stack di chiamate completo su printStackTrace()?
- 30. Stack non necessari su amd64
Non sapevo che esistesse l'API; Quanto è utile! – Jamie
Non ti aiuta per HP-UX che;) – DaveR
@dave, selettore nitido: P –