在HP-UX和Linux上展开堆叠

我需要在某些地方获取C应用程序的堆栈信息。 我已经阅读文档,并searchnetworking,但仍然不知道我怎么能做到这一点。 你能指出一个简单的过程解释吗? 或者,更好的是一个堆栈展开的例子。 我需要它用于HP-UX(Itanium)和Linux。

看看linux / stacktrace.h

这是一个API参考:

http://www.cs.cmu.edu/afs/cs/Web/People/tekkotsu/dox/StackTrace_8h.html

应该适用于所有的Linux内核

这里是C中的一个替代例子

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)); } 

您想查看libunwind – 这是一个由HP开发的跨平台库,用于解开Itanium堆栈跟踪(特别复杂); 但随后已经扩展到许多其他平台; 包括x86-Linux和Itanium-HPUX。

从libunwind(3)手册页; 下面是使用libunwind编写典型的“显示回溯”功能的示例:

 #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); } } 

HPUX itanium的这个双肩工作: http : //docs.hp.com/en/B9106-90012/unwind.5.html

对于简单的堆栈跟踪,请尝试U_STACK_TRACE()。