32 gdb_assert (c->
var.has_value ());
35#ifndef GDB_PRINT_INTERNAL_BACKTRACE
36 if (c->
var->get<
bool> ())
38 c->
var->set<
bool> (
false);
39 error (_(
"support for this feature is not compiled into GDB"));
44#ifdef GDB_PRINT_INTERNAL_BACKTRACE
45#ifdef GDB_PRINT_INTERNAL_BACKTRACE_USING_LIBBACKTRACE
50libbacktrace_error (
void *data,
const char *errmsg,
int errnum)
57 const auto sig_write = [] (
const char *msg) ->
void
59 gdb_stderr->write_async_safe (msg, strlen (msg));
62 sig_write (
"error creating backtrace: ");
67 snprintf (buf,
sizeof (buf),
": %d", errnum);
68 buf[
sizeof (buf) - 1] =
'\0';
78libbacktrace_print (
void *data, uintptr_t pc,
const char *filename,
79 int lineno,
const char *function)
81 const auto sig_write = [] (
const char *msg) ->
void
83 gdb_stderr->write_async_safe (msg, strlen (msg));
92 snprintf (buf,
sizeof (buf),
"0x%" PRIxPTR
" ", pc);
93 buf[
sizeof (buf) - 1] =
'\0';
95 sig_write (function ==
nullptr ?
"???" : function);
96 if (filename !=
nullptr)
101 snprintf (buf,
sizeof (buf),
"%d", lineno);
102 buf[
sizeof (buf) - 1] =
'\0';
107 return function !=
nullptr && strcmp (function,
"main") == 0;
115gdb_internal_backtrace_1 ()
117 static struct backtrace_state *state =
nullptr;
119 if (state ==
nullptr)
120 state = backtrace_create_state (
nullptr, 0, libbacktrace_error,
nullptr);
122 backtrace_full (state, 0, libbacktrace_print, libbacktrace_error,
nullptr);
125#elif defined GDB_PRINT_INTERNAL_BACKTRACE_USING_EXECINFO
130gdb_internal_backtrace_1 ()
132 const auto sig_write = [] (
const char *msg) ->
void
134 gdb_stderr->write_async_safe (msg, strlen (msg));
139 int frames = backtrace (buffer, ARRAY_SIZE (buffer));
141 backtrace_symbols_fd (buffer, frames,
gdb_stderr->fd ());
142 if (frames == ARRAY_SIZE (buffer))
143 sig_write (_(
"Backtrace might be incomplete.\n"));
147#error "unexpected internal backtrace policy"
159#ifdef GDB_PRINT_INTERNAL_BACKTRACE
160 const auto sig_write = [] (
const char *msg) ->
void
162 gdb_stderr->write_async_safe (msg, strlen (msg));
165 sig_write (_(
"----- Backtrace -----\n"));
168 gdb_internal_backtrace_1 ();
170 sig_write (_(
"Backtrace unavailable\n"));
172 sig_write (
"---------------------\n");
void gdb_internal_backtrace_set_cmd(const char *args, int from_tty, cmd_list_element *c)
void gdb_internal_backtrace()
gdb::optional< setting > var
__extension__ enum cmd_types type