1 /*	$NetBSD: backtrace.h,v 1.4 2014/12/10 04:38:00 christos Exp $	*/
2 
3 /*
4  * Copyright (C) 2009  Internet Systems Consortium, Inc. ("ISC")
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /* Id: backtrace.h,v 1.2 2009/09/01 18:40:25 jinmei Exp  */
20 
21 /*! \file isc/backtrace.h
22  * \brief provide a back trace of the running process to help debug problems.
23  *
24  * This module tries to get a back trace of the process using some platform
25  * dependent way when available.  It also manages an internal symbol table
26  * that maps function addresses used in the process to their textual symbols.
27  * This module is expected to be used to help debug when some fatal error
28  * happens.
29  *
30  * IMPORTANT NOTE: since the (major) intended use case of this module is
31  * dumping a back trace on a fatal error, normally followed by self termination,
32  * functions defined in this module generally doesn't employ assertion checks
33  * (if it did, a program bug could cause infinite recursive calls to a
34  * backtrace function).  These functions still perform minimal checks and return
35  * ISC_R_FAILURE if they detect an error, but the caller should therefore be
36  * very careful about the use of these functions, and generally discouraged to
37  * use them except in an exit path.  The exception is
38  * isc_backtrace_getsymbolfromindex(), which is expected to be used in a
39  * non-error-handling context and validates arguments with assertion checks.
40  */
41 
42 #ifndef ISC_BACKTRACE_H
43 #define ISC_BACKTRACE_H 1
44 
45 /***
46  ***	Imports
47  ***/
48 
49 #include <isc/types.h>
50 
51 /***
52  *** Types
53  ***/
54 struct isc_backtrace_symmap {
55 	void		*addr;
56 	const char	*symbol;
57 };
58 
59 extern const int isc__backtrace_nsymbols;
60 extern const isc_backtrace_symmap_t isc__backtrace_symtable[];
61 
62 /***
63  *** Functions
64  ***/
65 
66 ISC_LANG_BEGINDECLS
67 isc_result_t
68 isc_backtrace_gettrace(void **addrs, int maxaddrs, int *nframes);
69 /*%<
70  * Get a back trace of the running process above this function itself.  On
71  * success, addrs[i] will store the address of the call point of the i-th
72  * stack frame (addrs[0] is the caller of this function).  *nframes will store
73  * the total number of frames.
74  *
75  * Requires (note that these are not ensured by assertion checks, see above):
76  *
77  *\li	'addrs' is a valid array containing at least 'maxaddrs' void * entries.
78  *
79  *\li	'nframes' must be non NULL.
80  *
81  * Returns:
82  *
83  *\li	#ISC_R_SUCCESS
84  *\li	#ISC_R_FAILURE
85  *\li	#ISC_R_NOTFOUND
86  *\li	#ISC_R_NOTIMPLEMENTED
87  */
88 
89 isc_result_t
90 isc_backtrace_getsymbolfromindex(int index, const void **addrp,
91 				 const char **symbolp);
92 /*%<
93  * Returns the content of the internal symbol table of the given index.
94  * On success, *addrsp and *symbolp point to the address and the symbol of
95  * the 'index'th entry of the table, respectively.  If 'index' is not in the
96  * range of the symbol table, ISC_R_RANGE will be returned.
97  *
98  * Requires
99  *
100  *\li	'addrp' must be non NULL && '*addrp' == NULL.
101  *
102  *\li	'symbolp' must be non NULL && '*symbolp' == NULL.
103  *
104  * Returns:
105  *
106  *\li	#ISC_R_SUCCESS
107  *\li	#ISC_R_RANGE
108  */
109 
110 isc_result_t
111 isc_backtrace_getsymbol(const void *addr, const char **symbolp,
112 			unsigned long *offsetp);
113 /*%<
114  * Searches the internal symbol table for the symbol that most matches the
115  * given 'addr'.  On success, '*symbolp' will point to the name of function
116  * to which the address 'addr' belong, and '*offsetp' will store the offset
117  * from the function's entry address to 'addr'.
118  *
119  * Requires (note that these are not ensured by assertion checks, see above):
120  *
121  *\li	'symbolp' must be non NULL && '*symbolp' == NULL.
122  *
123  *\li	'offsetp' must be non NULL.
124  *
125  * Returns:
126  *
127  *\li	#ISC_R_SUCCESS
128  *\li	#ISC_R_FAILURE
129  *\li	#ISC_R_NOTFOUND
130  */
131 ISC_LANG_ENDDECLS
132 
133 #endif	/* ISC_BACKTRACE_H */
134