xref: /minix3/external/bsd/bind/dist/bin/tests/backtrace_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1 /*	$NetBSD: backtrace_test.c,v 1.7 2014/12/10 04:37:53 christos Exp $	*/
2 
3 /*
4  * Copyright (C) 2009, 2013  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_test.c,v 1.4 2009/09/02 23:48:01 tbox Exp  */
20 
21 #include <config.h>
22 
23 #include <stdio.h>
24 #include <string.h>
25 
26 #include <isc/backtrace.h>
27 #include <isc/result.h>
28 
29 const char *expected_symbols[] = {
30 	"func3",
31 	"func2",
32 	"func1",
33 	"main"
34 };
35 
36 static int
func3()37 func3() {
38 	void *tracebuf[16];
39 	int i, nframes;
40 	int error = 0;
41 	const char *fname;
42 	isc_result_t result;
43 	unsigned long offset;
44 
45 	result = isc_backtrace_gettrace(tracebuf, 16, &nframes);
46 	if (result != ISC_R_SUCCESS) {
47 		printf("isc_backtrace_gettrace failed: %s\n",
48 		       isc_result_totext(result));
49 		return (1);
50 	}
51 
52 	if (nframes < 4)
53 		error++;
54 
55 	for (i = 0; i < 4 && i < nframes; i++) {
56 		fname = NULL;
57 		result = isc_backtrace_getsymbol(tracebuf[i], &fname, &offset);
58 		if (result != ISC_R_SUCCESS) {
59 			error++;
60 			continue;
61 		}
62 		if (strcmp(fname, expected_symbols[i]) != 0)
63 			error++;
64 	}
65 
66 	if (error) {
67 		printf("Unexpected result:\n");
68 		printf("  # of frames: %d (expected: at least 4)\n", nframes);
69 		printf("  symbols:\n");
70 		for (i = 0; i < nframes; i++) {
71 			fname = NULL;
72 			result = isc_backtrace_getsymbol(tracebuf[i], &fname,
73 							 &offset);
74 			if (result == ISC_R_SUCCESS)
75 				printf("  [%d] %s\n", i, fname);
76 			else {
77 				printf("  [%d] %p getsymbol failed: %s\n", i,
78 				       tracebuf[i], isc_result_totext(result));
79 			}
80 		}
81 	}
82 
83 	return (error);
84 }
85 
86 static int
func2()87 func2() {
88 	return (func3());
89 }
90 
91 static int
func1()92 func1() {
93 	return (func2());
94 }
95 
96 int
main()97 main() {
98 	return (func1());
99 }
100