00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #if defined(__i386__)
00019
00020 #include "FatalSignals.h"
00021
00022 #if defined(__linux__)
00023 #include <asm/sigcontext.h>
00024 struct sigframe
00025 {
00026 char *pretcode;
00027 int sig;
00028 struct sigcontext sc;
00029 struct _fpstate fpstate;
00030 };
00031 #endif
00032
00033
00034
00035
00036
00037
00038
00039 size_t
00040 StackTrace::get_trace(void* stack[], size_t size, u_int sighandler_frame)
00041 {
00042 void **fp;
00043
00044 asm volatile("movl %%ebp,%0" : "=r" (fp));
00045
00046 stack[0] = 0;
00047 size_t frame = 1;
00048 while (frame < size) {
00049 if (*(fp + 1) == 0 || *fp == 0)
00050 break;
00051
00052 if (sighandler_frame != 0 && frame == sighandler_frame) {
00053 #if defined(__linux__)
00054 struct sigframe* sf = (struct sigframe*)(fp+1);
00055 struct sigcontext* scxt = &(sf->sc);
00056 stack[frame] = (void*) scxt->eip;
00057 #else
00058 stack[frame] = *(fp + 1);
00059 #endif
00060 } else {
00061 stack[frame] = *(fp + 1);
00062 }
00063
00064 fp = (void **)(*fp);
00065 ++frame;
00066 }
00067
00068 return frame;
00069 }
00070
00071 #endif