سؤال

أحتاج إلى الحصول على معلومات المكدس من تطبيقي C في نقاط معينة. لقد قرأت الوثائق وفتشت الشبكة ولكنها لا تزال لا تستطيع معرفة كيف يمكنني القيام بذلك. يمكنك الإشارة إلى شرح عملية بسيطة؟ أو، حتى أفضل، إلى مثال على المكدس المرافق. أحتاجها ل HP-UX (Itanium) و Linux.

هل كانت مفيدة؟

المحلول

الدفع لينكس / stacktrace.h.

فيما يلي مرجع API:

http://www.cs.cmu.edu/afs/cs/web/people/tekkotsu/stoks/stacktrace_8h.html.

يجب أن تعمل على جميع نواة Linux

هنا مثال بديل في ج

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 لآثار مكدس إيتانيوم غير مرغوب (وهي معقدة بشكل خاص)؛ ولكن تم توسيعها لاحقا إلى العديد من المنصات الأخرى؛ بما في ذلك كل من X86-Linux و Itanium-HPUX.

من صفحة Libonwind (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);
  }
}

هذا العمل شولو ل HPUX Itanium:http://docs.hp.com/en/b9106-90012/unwind.5.html.

لتتبع مكدس بسيط، حاول u_stack_trace ().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top