Branch
Hash :
7b089321
Author :
Date :
2025-01-01T09:24:36
maint: run 'make update-copyright'
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
/* print_stack_trace() function that prints a stack trace.
Copyright (C) 2024-2025 Free Software Foundation, Inc.
This file is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. */
#if HAVE_LIBBACKTRACE
# include <backtrace.h>
static struct backtrace_state *state /* = NULL */;
static inline void
# if (__GNUC__ >= 3) || (__clang_major__ >= 4)
__attribute__ ((always_inline))
# endif
print_stack_trace_to (FILE *stream)
{
if (state == NULL)
state = backtrace_create_state (NULL, 0, NULL, NULL);
fprintf (stream, "Stack trace:\n");
/* Pass skip=0, to work around <https://github.com/ianlancetaylor/libbacktrace/issues/60>. */
backtrace_print (state, 0, stream);
}
#elif HAVE_LIBASAN
# include <stdio.h>
/* We need only one declaration from <sanitizer/asan_interface.h>. */
extern
# ifdef __cplusplus
"C"
# endif
void __sanitizer_print_stack_trace (void);
/* The only supported stream, in this case, is stderr. */
static inline void
# if (__GNUC__ >= 3) || (__clang_major__ >= 4)
__attribute__ ((always_inline))
# endif
print_stack_trace_to (FILE *stream)
{
fprintf (stream, "Stack trace:\n");
__sanitizer_print_stack_trace ();
}
#elif HAVE_EXECINFO_H
# include <stdio.h>
# include "execinfo.h"
static inline void
# if (__GNUC__ >= 3) || (__clang_major__ >= 4)
__attribute__ ((always_inline))
# endif
print_stack_trace_to (FILE *stream)
{
void *buffer[100];
int max_size = sizeof (buffer) / sizeof (buffer[0]);
int size = backtrace (buffer, max_size);
if (size > 0)
{
char **symbols = backtrace_symbols (buffer, size);
if (symbols != NULL)
{
int i;
fprintf (stream, "Stack trace:\n");
for (i = 0; i < size; i++)
fprintf (stream, "%s\n", symbols[i]);
fflush (stream);
free (symbols);
}
}
}
#endif