doc: Add serial to list of ci file reserved words
[charm.git] / src / conv-core / cmibacktrace.c
1 /*
2 Stack Tracing, for debugging.
3   
4 This routine lets you inspect the run-time stack
5 for the names of the routines that have been called up 
6 to this point.  It's useful for things like CkAbort
7 that are called when stuff has gone really wrong and 
8 you'd like to know what led up to this point.
9 These routines even seem to work from signal handlers, 
10 although I wouldn't count on that.
11
12 This file is intended to be #included whole by the autoconf
13 script and conv-core.c.
14
15 Orion Sky Lawlor, olawlor@acm.org, 8/20/2002
16 */
17
18 #if CMK_USE_BACKTRACE
19 #  include <execinfo.h> /* for backtrace (GNU glibc header) */
20
21 /* Extract the function-return pointers listed in the stack
22    up to this depth.
23  */
24 void CmiBacktraceRecord(void **retPtrs,int nSkip,int *nLevels) {
25         int i;
26 #define max_stack 64 /* trace back at most this many levels of the stack */
27         void *stackPtrs[max_stack];
28         nSkip++; /* don't trace this routine */
29         *nLevels=backtrace(stackPtrs,nSkip+*nLevels)-nSkip;
30         for (i=0;i<*nLevels;i++)
31                 retPtrs[i]=stackPtrs[nSkip+i];
32 }
33
34 /* Meant to be used for large stack traces, avoids copy */
35 void CmiBacktraceRecordHuge(void **retPtrs,int *nLevels) {
36   *nLevels=backtrace(retPtrs,*nLevels);
37 }
38
39 /* Look up the names of these function pointers */
40 char **CmiBacktraceLookup(void **srcPtrs,int nLevels) {
41         return backtrace_symbols(srcPtrs,nLevels);
42 }
43
44 #else /*Backtrace not available-- use do-nothing version*/
45 void CmiBacktraceRecord(void **retPtrs,int nSkip,int *nLevels) {
46         *nLevels=0;
47 }
48
49 void CmiBacktraceRecordHuge(void **retPtrs,int nSkip,int *nLevels) {
50     *nLevels=0;
51 }
52
53 /* Look up the names of these function pointers */
54 char **CmiBacktraceLookup(void **srcPtrs,int nLevels) {
55         return NULL;
56 }
57 #endif