61 return f2 (__LINE__) + 1;
67 return f3 (f1line, __LINE__) + 2;
71f3 (
int f1line,
int f2line)
83 f3line = __LINE__ + 1;
88 fprintf (stderr,
"test1: unexpected return value %d\n", i);
95 "test1: not enough frames; got %zu, expected at least 3\n",
100 check (
"test1", 0,
all, f3line,
"f3",
"btest.c", &
data.failed);
101 check (
"test1", 1,
all, f2line,
"f2",
"btest.c", &
data.failed);
102 check (
"test1", 2,
all, f1line,
"test1",
"btest.c", &
data.failed);
104 printf (
"%s: backtrace_full noinline\n",
data.failed ?
"FAIL" :
"PASS");
121 return f12 (__LINE__) + 1;
127 return f13 (f1line, __LINE__) + 2;
131f13 (
int f1line,
int f2line)
143 f3line = __LINE__ + 1;
148 fprintf (stderr,
"test2: unexpected return value %d\n", i);
152 check (
"test2", 0,
all, f3line,
"f13",
"btest.c", &
data.failed);
153 check (
"test2", 1,
all, f2line,
"f12",
"btest.c", &
data.failed);
154 check (
"test2", 2,
all, f1line,
"test2",
"btest.c", &
data.failed);
156 printf (
"%s: backtrace_full inline\n",
data.failed ?
"FAIL" :
"PASS");
173 return f22 (__LINE__) + 1;
179 return f23 (f1line, __LINE__) + 2;
183f23 (
int f1line,
int f2line)
195 f3line = __LINE__ + 1;
200 fprintf (stderr,
"test3: unexpected return value %d\n", i);
215 for (j = 0; j < 3; ++j)
222 (
"test3: unexpected return value "
223 "from backtrace_pcinfo %d\n"),
230 (
"wrong number of calls from backtrace_pcinfo "
231 "got %u expected %d\n"),
244 for (j = 0; j < 3; ++j)
258 (
"test3: [%d]: unexpected return value "
259 "from backtrace_syminfo %d\n"),
266 const char *expected;
285 fprintf (stderr,
"test3: [%d]: NULL syminfo name\n", j);
290 else if (strncmp (
symdata.
name, expected, strlen (expected))
294 (
"test3: [%d]: unexpected syminfo name "
295 "got %s expected %s\n"),
306 printf (
"%s: backtrace_simple noinline\n",
data.failed ?
"FAIL" :
"PASS");
323 return f32 (__LINE__) + 1;
329 return f33 (f1line, __LINE__) + 2;
333f33 (
int f1line,
int f2line)
345 f3line = __LINE__ + 1;
350 fprintf (stderr,
"test3: unexpected return value %d\n", i);
369 (
"test4: unexpected return value "
370 "from backtrace_pcinfo %d\n"),
383 printf (
"%s: backtrace_simple inline\n",
data.failed ?
"FAIL" :
"PASS");
400 uintptr_t addr = (uintptr_t) &global;
402 if (
sizeof (global) > 1)
415 "test5: unexpected return value from backtrace_syminfo %d\n",
424 fprintf (stderr,
"test5: NULL syminfo name\n");
427 else if (!(strncmp (
symdata.
name,
"global", 6) == 0
431 "test5: unexpected syminfo name got %s expected %s\n",
438 "test5: unexpected syminfo value got %lx expected %lx\n",
440 (
unsigned long) (uintptr_t) &global);
446 "test5: unexpected syminfo size got %lx expected %lx\n",
448 (
unsigned long) sizeof (global));
453 printf (
"%s: backtrace_syminfo variable\n",
462#define MIN_DESCRIPTOR 3
463#define MAX_DESCRIPTOR 10
487 "ERROR: descriptor %d still open after tests complete\n",
504#if BACKTRACE_SUPPORTED
509#if BACKTRACE_SUPPORTS_DATA
516 exit (
failures ? EXIT_FAILURE : EXIT_SUCCESS);
#define BACKTRACE_SUPPORTS_THREADS
int backtrace_syminfo(struct backtrace_state *state, uintptr_t addr, backtrace_syminfo_callback callback, backtrace_error_callback error_callback, void *data)
int backtrace_simple(struct backtrace_state *state, int skip, backtrace_simple_callback callback, backtrace_error_callback error_callback, void *data)
int backtrace_full(struct backtrace_state *state, int skip, backtrace_full_callback callback, backtrace_error_callback error_callback, void *data)
struct backtrace_state * backtrace_create_state(const char *filename, int threaded, backtrace_error_callback error_callback, void *data)
int backtrace_pcinfo(struct backtrace_state *state, uintptr_t pc, backtrace_full_callback callback, backtrace_error_callback error_callback, void *data)
static void check_open_files(void)
static int f12(int f1line)
static int f2(int f1line)
static int f32(int f1line)
static int fstat_status[MAX_DESCRIPTOR]
static int f13(int f1line, int f2line)
static int f23(int f1line, int f2line)
static void check_available_files(void)
int main(int argc ATTRIBUTE_UNUSED, char **argv)
static int f22(int f1line)
static int f3(int f1line, int f2line)
static int f33(int f1line, int f2line)
void callback_three(void *vdata, uintptr_t pc ATTRIBUTE_UNUSED, const char *symname, uintptr_t symval, uintptr_t symsize)
void check(const char *name, int index, const struct info *all, int want_lineno, const char *want_function, const char *want_file, int *failed)
void error_callback_three(void *vdata, const char *msg, int errnum)
int callback_two(void *vdata, uintptr_t pc)
void error_callback_create(void *data ATTRIBUTE_UNUSED, const char *msg, int errnum)
int callback_one(void *vdata, uintptr_t pc ATTRIBUTE_UNUSED, const char *filename, int lineno, const char *function)
void error_callback_one(void *vdata, const char *msg, int errnum)
void error_callback_two(void *vdata, const char *msg, int errnum)
Functions to help with cleanup.