質問

私は、特定のポイントでの私のCアプリケーションのスタック情報を取得する必要があります。私は、マニュアルを読み、ネットを検索するが、それでも、私はそれを行うことができる方法を見つけ出すことはできませんしました。あなたは、単純なプロセスの説明を指すことはできますか?または、より良い、スタックの巻き戻しの例に。私は、HP-UX(Itanium)版およびLinuxのためにそれを必要とします。

役に立ちましたか?

解決

チェックアウトののlinux / stacktrace.h

ここではAPIリファレンスがあります:

のhttp://www.cs .cmu.edu / AFS / CS /ウェブ/人々/ 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));

}

他のヒント

これがために、HPが独自に開発したクロスプラットフォームのライブラリです -

あなたは libunwindのを見てみたいです(特に複雑である)の巻き戻しのItaniumスタックトレース。しかし、その後、他の多くのプラットフォームに拡張されました。 x86ベースのLinuxおよびItanium-HP-UXの両方を含めます。

libunwindの(3)のmanページから。ここでは典型的な「ショーのバックトレース」関数を書くこと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);
  }
}
HP-UXのItaniumのための

このshoulw作品: http://docs.hp.com/en/B9106-90012/ unwind.5.htmlする

簡単なスタックトレースについては、)(U_STACK_TRACEを試してみます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top