Frage

Ich brauche die Stack-Informationen meiner C-Anwendung in bestimmten Punkten zu erhalten. Ich habe die Dokumentation und durchsucht das Netz lesen, aber immer noch nicht herausfinden können, wie ich es tun kann. Können Sie zu einem einfachen Prozess Erklärung hinweisen? Oder, noch besser, auf ein Beispiel Stack Abwickeln. Ich brauche es für HP-UX (Itanium) und Linux.

War es hilfreich?

Lösung

Überprüfen Sie heraus linux / stacktrace.h

Hier ist eine API-Referenz:

http: //www.cs .cmu.edu / afs / cs / Web / Leute / tekkotsu / Dox / StackTrace_8h.html

Sollte auf allen Linux-Kernel funktionieren

Hier ist ein alternatives Beispiel in C von

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

}

Andere Tipps

Sie möchten unter libunwind - das ist eine plattformübergreifende Bibliothek ursprünglich von HP entwickelt für Abwickeln Itanium Stapel Spuren (die besonders komplex); sondern hat in der Folge auf vielen anderen Plattformen erweitert worden; einschließlich x86-Linux und Itanium-HP-UX.

Von der libunwind (3) man-Seite; hier ist ein Beispiel für die Verwendung libunwind eine typische ‚show Backtrace‘ Funktion zu schreiben:

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

Diese shoulw Arbeit für HP-UX itanium: http://docs.hp.com/en/B9106-90012/ unwind.5.html

Für einfache Stack-Trace, versucht U_STACK_TRACE ().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top