00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #if CMK_USE_BACKTRACE
00019 # include <execinfo.h>
00020
00021
00022
00023
00024 void CmiBacktraceRecord(void **retPtrs,int nSkip,int *nLevels) {
00025 int i;
00026 #define max_stack 64
00027 void *stackPtrs[max_stack];
00028 nSkip++;
00029 *nLevels=backtrace(stackPtrs,nSkip+*nLevels)-nSkip;
00030 for (i=0;i<*nLevels;i++)
00031 retPtrs[i]=stackPtrs[nSkip+i];
00032 }
00033
00034
00035 void CmiBacktraceRecordHuge(void **retPtrs,int *nLevels) {
00036 *nLevels=backtrace(retPtrs,*nLevels);
00037 }
00038
00039
00040 char **CmiBacktraceLookup(void **srcPtrs,int nLevels) {
00041 return backtrace_symbols(srcPtrs,nLevels);
00042 }
00043
00044 #else
00045 #include <stddef.h>
00046 void CmiBacktraceRecord(void **retPtrs,int nSkip,int *nLevels) {
00047 *nLevels=0;
00048 }
00049
00050 void CmiBacktraceRecordHuge(void **retPtrs,int nSkip,int *nLevels) {
00051 *nLevels=0;
00052 }
00053
00054
00055 char **CmiBacktraceLookup(void **srcPtrs,int nLevels) {
00056 return NULL;
00057 }
00058 #endif