代码之家  ›  专栏  ›  技术社区  ›  GMichael

HP-UX和Linux上的堆栈展开

  •  5
  • GMichael  · 技术社区  · 15 年前

    我需要在某些点上获取我的C应用程序的堆栈信息。我已经阅读了文档并搜索了网络,但仍然不知道如何才能做到这一点。你能指出一个简单的过程解释吗?或者,更好的是,以堆栈展开为例。我需要它用于HP-UX(安腾)和Linux。

    3 回复  |  直到 11 年前
        1
  •  4
  •   Aiden Bell    15 年前

    退房

    以下是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));
    
    }
    
        2
  •  3
  •   DaveR    15 年前

    你想看看吗 libunwind -这是一个跨平台库,最初由HP开发,用于展开安腾堆栈跟踪(特别复杂);但随后被扩展到许多其他平台;包括x86 Linux和安腾HPUX。

    从libunwind(3)手册页;下面是使用libunwind编写典型的“show backtrace”函数的示例:

    #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);
      }
    }
    
        3
  •  0
  •   pt pt    15 年前

    这应该适用于HPUX安腾: http://docs.hp.com/en/B9106-90012/unwind.5.html

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

    推荐文章