Necesito obtener la información de pila de mi aplicación C en ciertos puntos. He leído la documentación y buscado en la red, pero todavía no puedo entender cómo puedo hacerlo. ¿Puedes señalar una explicación simple del proceso? O, mejor aún, a un ejemplo de desenrollado de la pila. Lo necesito para HP-UX (Itanium) y Linux.Desenrollado de pila en HP-UX y Linux
Respuesta
Salida Linux/stacktrace.h
Aquí es una referencia de la API:
http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html
debería funcionar en todos los núcleos de Linux
Aquí es un ejemplo alternativo en C de
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));
}
Usted quiere mirar libunwind - esto es una biblioteca multiplataforma desarrollada originalmente por HP para desenrollar seguimientos de pila Itanium (que son particularmente complejas); pero posteriormente se ha expandido a muchas otras plataformas; incluyendo tanto x86-Linux como Itanium-HPUX.
De la página de comando man libunwind (3); aquí es un ejemplo del uso libunwind escribir una función típica 'espectáculo traza inversa': trabajo
#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);
}
}
Este shoulw para HPUX Itanium: http://docs.hp.com/en/B9106-90012/unwind.5.html
Para sencilla seguimiento de la pila, intente U_STACK_TRACE().
- 1. Java y C++ en problema de desenrollado de pila
- 2. Comportamiento diferente Pila de desenrollado en x64 y x32
- 3. ¿Qué es el desenrollado de la pila?
- 4. ¿Cómo implementa gcc el desenrollado de la pila para las excepciones de C++ en Linux?
- 5. Cómo detectar el desenrollado de la pila en un Destructor
- 6. ¿Cómo superar una incompatibilidad entre el ksh en Linux y el que está instalado en AIX/Solaris/HPUX?
- 7. ¿Qué es la pila de Linux?
- 8. ¿Cuándo es efectivo el desenrollado de lazo?
- 9. Aumente el tamaño de la pila en Linux con setrlimit
- 10. Ejemplo de pila ejecutable en Linux (arquitectura i386)
- 11. Variables de pila y pila falsas
- 12. Uso adecuado de pila y pila en C++?
- 13. Estado inicial de los registros del programa y la pila en Linux ARM
- 14. Pila de red de Linux: agregando protocolos con un LKM y dev_add_pack
- 15. Creación de objetos en la pila/pila?
- 16. Bloquear pila y cola libres en C#
- 17. enable_shared_from_this y objetos en la pila
- 18. pila y montón en V8 (JavaScript)
- 19. Base puntero y pila puntero
- 20. Implementación de una pila genérica segura para subprocesos en C++ en linux
- 21. Biblioteca para registrar la Pila de llamadas en tiempo de ejecución (Windows/Linux)
- 22. montón y pila de ensamblaje de Windows?
- 23. PermGen y Pila, Diferencia y su significado
- 24. AppDomain.FirstChanceException y excepción de desbordamiento de pila
- 25. ¿Hay un límite de tamaño de pila de un proceso en Linux
- 26. En Linux SCHED_FIFO y SCHED_RR
- 27. killproc y pidofproc en Linux
- 28. compilando en Windows y Linux
- 29. unistd.h y C99 en Linux
- 30. Linux Crypto API y linux/crypto.h - Documentación
No sabía que existía API; ¡Qué util! – Jamie
No lo ayuda con HP-UX;) – DaveR
@dave, nit-picker: P –