xref: /minix3/external/bsd/bind/dist/bin/tests/backtrace_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: backtrace_test.c,v 1.7 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2009, 2013  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id: backtrace_test.c,v 1.4 2009/09/02 23:48:01 tbox Exp  */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek #include <config.h>
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <stdio.h>
24*00b67f09SDavid van Moolenbroek #include <string.h>
25*00b67f09SDavid van Moolenbroek 
26*00b67f09SDavid van Moolenbroek #include <isc/backtrace.h>
27*00b67f09SDavid van Moolenbroek #include <isc/result.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek const char *expected_symbols[] = {
30*00b67f09SDavid van Moolenbroek 	"func3",
31*00b67f09SDavid van Moolenbroek 	"func2",
32*00b67f09SDavid van Moolenbroek 	"func1",
33*00b67f09SDavid van Moolenbroek 	"main"
34*00b67f09SDavid van Moolenbroek };
35*00b67f09SDavid van Moolenbroek 
36*00b67f09SDavid van Moolenbroek static int
func3()37*00b67f09SDavid van Moolenbroek func3() {
38*00b67f09SDavid van Moolenbroek 	void *tracebuf[16];
39*00b67f09SDavid van Moolenbroek 	int i, nframes;
40*00b67f09SDavid van Moolenbroek 	int error = 0;
41*00b67f09SDavid van Moolenbroek 	const char *fname;
42*00b67f09SDavid van Moolenbroek 	isc_result_t result;
43*00b67f09SDavid van Moolenbroek 	unsigned long offset;
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek 	result = isc_backtrace_gettrace(tracebuf, 16, &nframes);
46*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS) {
47*00b67f09SDavid van Moolenbroek 		printf("isc_backtrace_gettrace failed: %s\n",
48*00b67f09SDavid van Moolenbroek 		       isc_result_totext(result));
49*00b67f09SDavid van Moolenbroek 		return (1);
50*00b67f09SDavid van Moolenbroek 	}
51*00b67f09SDavid van Moolenbroek 
52*00b67f09SDavid van Moolenbroek 	if (nframes < 4)
53*00b67f09SDavid van Moolenbroek 		error++;
54*00b67f09SDavid van Moolenbroek 
55*00b67f09SDavid van Moolenbroek 	for (i = 0; i < 4 && i < nframes; i++) {
56*00b67f09SDavid van Moolenbroek 		fname = NULL;
57*00b67f09SDavid van Moolenbroek 		result = isc_backtrace_getsymbol(tracebuf[i], &fname, &offset);
58*00b67f09SDavid van Moolenbroek 		if (result != ISC_R_SUCCESS) {
59*00b67f09SDavid van Moolenbroek 			error++;
60*00b67f09SDavid van Moolenbroek 			continue;
61*00b67f09SDavid van Moolenbroek 		}
62*00b67f09SDavid van Moolenbroek 		if (strcmp(fname, expected_symbols[i]) != 0)
63*00b67f09SDavid van Moolenbroek 			error++;
64*00b67f09SDavid van Moolenbroek 	}
65*00b67f09SDavid van Moolenbroek 
66*00b67f09SDavid van Moolenbroek 	if (error) {
67*00b67f09SDavid van Moolenbroek 		printf("Unexpected result:\n");
68*00b67f09SDavid van Moolenbroek 		printf("  # of frames: %d (expected: at least 4)\n", nframes);
69*00b67f09SDavid van Moolenbroek 		printf("  symbols:\n");
70*00b67f09SDavid van Moolenbroek 		for (i = 0; i < nframes; i++) {
71*00b67f09SDavid van Moolenbroek 			fname = NULL;
72*00b67f09SDavid van Moolenbroek 			result = isc_backtrace_getsymbol(tracebuf[i], &fname,
73*00b67f09SDavid van Moolenbroek 							 &offset);
74*00b67f09SDavid van Moolenbroek 			if (result == ISC_R_SUCCESS)
75*00b67f09SDavid van Moolenbroek 				printf("  [%d] %s\n", i, fname);
76*00b67f09SDavid van Moolenbroek 			else {
77*00b67f09SDavid van Moolenbroek 				printf("  [%d] %p getsymbol failed: %s\n", i,
78*00b67f09SDavid van Moolenbroek 				       tracebuf[i], isc_result_totext(result));
79*00b67f09SDavid van Moolenbroek 			}
80*00b67f09SDavid van Moolenbroek 		}
81*00b67f09SDavid van Moolenbroek 	}
82*00b67f09SDavid van Moolenbroek 
83*00b67f09SDavid van Moolenbroek 	return (error);
84*00b67f09SDavid van Moolenbroek }
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek static int
func2()87*00b67f09SDavid van Moolenbroek func2() {
88*00b67f09SDavid van Moolenbroek 	return (func3());
89*00b67f09SDavid van Moolenbroek }
90*00b67f09SDavid van Moolenbroek 
91*00b67f09SDavid van Moolenbroek static int
func1()92*00b67f09SDavid van Moolenbroek func1() {
93*00b67f09SDavid van Moolenbroek 	return (func2());
94*00b67f09SDavid van Moolenbroek }
95*00b67f09SDavid van Moolenbroek 
96*00b67f09SDavid van Moolenbroek int
main()97*00b67f09SDavid van Moolenbroek main() {
98*00b67f09SDavid van Moolenbroek 	return (func1());
99*00b67f09SDavid van Moolenbroek }
100