1
0
mirror of https://https.git.savannah.gnu.org/git/gnulib.git synced 2026-05-13 15:13:36 +00:00
Files
gnulib/lib/stack-trace-impl.h
Bruno Haible 97897a6a42 stack-trace: New module.
* lib/stdlib.in.h (print_stack_trace): Make part of the stack-trace
module.
* lib/stack-trace-impl.h: New file, based on lib/abort-debug.c.
* lib/stack-trace.c: New file, based on lib/abort-debug.c.
* lib/abort-debug.c: Include stack-trace-impl.h. Remove definitions
moved to stack-trace-impl.h.
(print_stack_trace): Remove function.
* m4/stdlib_h.m4 (gl_STDLIB_H_REQUIRE_DEFAULTS): Initialize
GNULIB_STACK_TRACE.
(gl_STDLIB_H_DEFAULTS): Initialize CAN_PRINT_STACK_TRACE.
* m4/stack-trace.m4: New file, based on m4/abort-debug.m4.
* m4/abort-debug.m4 (gl_ABORT_DEBUG_EARLY): Remove macro.
(gl_ABORT_DEBUG): Require gl_STDLIB_H_DEFAULTS, gl_STACK_TRACE_EARLY.
Set REPLACE_ABORT here.
* modules/stdlib (Makefile.am): Substitute GNULIB_STACK_TRACE,
CAN_PRINT_STACK_TRACE.
* modules/stack-trace: New file.
* modules/abort-debug (Depends-on): Add stack-trace. Remove execinfo.
(configure.ac-early): Remove section.
* DEPENDENCIES: Update.
2024-07-18 04:11:05 +02:00

69 lines
1.9 KiB
C

/* print_stack_trace() function that prints a stack trace.
Copyright (C) 2024 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);
/* Pass skip=0, to work around <https://github.com/ianlancetaylor/libbacktrace/issues/60>. */
fprintf (stream, "Stack trace:\n");
backtrace_print (state, 0, stream);
}
#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