* [PATCH 0/3] Another set of debug output patches @ 2022-10-06 17:23 Andrew Burgess 2022-10-06 17:23 ` [PATCH 1/3] gdb: improve infrun_debug_show_threads output Andrew Burgess ` (3 more replies) 0 siblings, 4 replies; 7+ messages in thread From: Andrew Burgess @ 2022-10-06 17:23 UTC (permalink / raw) To: gdb-patches More infrun patches (1/3), some thread debug (2/3), and a new debug class 'infcall' (3/3). --- Andrew Burgess (3): gdb: improve infrun_debug_show_threads output gdb: extra debug output in thread.c gdb: add infcall specific debugging gdb/NEWS | 4 +++ gdb/doc/gdb.texinfo | 7 +++++ gdb/infcall.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ gdb/infrun.h | 2 ++ gdb/thread.c | 9 ++++++ 5 files changed, 90 insertions(+) -- 2.25.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/3] gdb: improve infrun_debug_show_threads output 2022-10-06 17:23 [PATCH 0/3] Another set of debug output patches Andrew Burgess @ 2022-10-06 17:23 ` Andrew Burgess 2022-10-06 17:23 ` [PATCH 2/3] gdb: extra debug output in thread.c Andrew Burgess ` (2 subsequent siblings) 3 siblings, 0 replies; 7+ messages in thread From: Andrew Burgess @ 2022-10-06 17:23 UTC (permalink / raw) To: gdb-patches This commit switches to use INFRUN_SCOPED_DEBUG_START_END in the infrun_debug_show_threads function, which means the output will get an extra level of indentation, this looks a little nicer I think. --- gdb/infrun.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gdb/infrun.h b/gdb/infrun.h index 0c7c55eabec..226cb3c3e34 100644 --- a/gdb/infrun.h +++ b/gdb/infrun.h @@ -62,6 +62,8 @@ infrun_debug_show_threads (const char *title, ThreadRange threads) { if (debug_infrun) { + INFRUN_SCOPED_DEBUG_ENTER_EXIT; + infrun_debug_printf ("%s:", title); for (thread_info *thread : threads) infrun_debug_printf (" thread %s, executing = %d, resumed = %d, " -- 2.25.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/3] gdb: extra debug output in thread.c 2022-10-06 17:23 [PATCH 0/3] Another set of debug output patches Andrew Burgess 2022-10-06 17:23 ` [PATCH 1/3] gdb: improve infrun_debug_show_threads output Andrew Burgess @ 2022-10-06 17:23 ` Andrew Burgess 2022-10-06 17:23 ` [PATCH 3/3] gdb: add infcall specific debugging Andrew Burgess 2022-10-07 19:11 ` [PATCH 0/3] Another set of debug output patches Tom Tromey 3 siblings, 0 replies; 7+ messages in thread From: Andrew Burgess @ 2022-10-06 17:23 UTC (permalink / raw) To: gdb-patches Add some extra 'threads' debug in a couple of places in thread.c. I've also added an additional gdb_assert in one case. --- gdb/thread.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gdb/thread.c b/gdb/thread.c index 378c5ee2d13..349fc01dd48 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -834,6 +834,10 @@ set_running_thread (struct thread_info *tp, bool running) started = true; tp->state = running ? THREAD_RUNNING : THREAD_STOPPED; + threads_debug_printf ("thread: %s, running? %d%s", + tp->ptid.to_string ().c_str (), running, + (started ? " (started" : "")); + if (!running) { /* If the thread is now marked stopped, remove it from @@ -1298,6 +1302,9 @@ info_threads_command_completer (struct cmd_list_element *ignore, void switch_to_thread_no_regs (struct thread_info *thread) { + gdb_assert (thread != nullptr); + threads_debug_printf ("thread = %s", thread->ptid.to_string ().c_str ()); + struct inferior *inf = thread->inf; set_current_program_space (inf->pspace); @@ -1315,6 +1322,8 @@ switch_to_no_thread () if (current_thread_ == nullptr) return; + threads_debug_printf ("thread = NONE"); + current_thread_ = nullptr; inferior_ptid = null_ptid; reinit_frame_cache (); -- 2.25.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 3/3] gdb: add infcall specific debugging 2022-10-06 17:23 [PATCH 0/3] Another set of debug output patches Andrew Burgess 2022-10-06 17:23 ` [PATCH 1/3] gdb: improve infrun_debug_show_threads output Andrew Burgess 2022-10-06 17:23 ` [PATCH 2/3] gdb: extra debug output in thread.c Andrew Burgess @ 2022-10-06 17:23 ` Andrew Burgess 2022-10-06 17:32 ` Eli Zaretskii 2022-10-07 19:11 ` [PATCH 0/3] Another set of debug output patches Tom Tromey 3 siblings, 1 reply; 7+ messages in thread From: Andrew Burgess @ 2022-10-06 17:23 UTC (permalink / raw) To: gdb-patches Add two new commands: set debug infcall on|off show debug infcall These enable some new debugging related to when GDB makes inferior function calls. I've added some basic debugging for what I think are the major steps in the inferior function call process, but I'm sure we might want to add more later. --- gdb/NEWS | 4 +++ gdb/doc/gdb.texinfo | 7 +++++ gdb/infcall.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/gdb/NEWS b/gdb/NEWS index 796a4ef8072..8b519a648f7 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -111,6 +111,10 @@ maintenance print frame-id [ LEVEL ] Print GDB's internal frame-id for the frame at LEVEL. If LEVEL is not given, then print the frame-id for the currently selected frame. +set debug infcall on|off +show debug infcall + Print additional debug messages about inferior function calls. + * Changed commands document user-defined diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 44d87e95748..e04c053c7bc 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -27587,6 +27587,13 @@ @item show debug infrun Displays the current state of @value{GDBN} inferior debugging. +@item set debug infcall +@cindex inferior function call debugging info +Turns on or off display of debugging info related to when @value{GDBN} +makes inferior function calls. +@item show debug infcall +Displays the current state of @value{GDBN} inferior function call debugging. + @item set debug jit @cindex just-in-time compilation, debugging messages Turn on or off debugging messages from JIT debug support. diff --git a/gdb/infcall.c b/gdb/infcall.c index 34852191043..8e12a119c15 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -44,6 +44,34 @@ #include "gdbsupport/scope-exit.h" #include <list> +/* True if we are debugging inferior calls. */ + +static bool debug_infcall = false; + +/* Print an "infcall" debug statement. */ + +#define infcall_debug_printf(fmt, ...) \ + debug_prefixed_printf_cond (debug_infcall, "infcall", fmt, ##__VA_ARGS__) + +/* Print "infcall" enter/exit debug statements. */ + +#define INFCALL_SCOPED_DEBUG_ENTER_EXIT \ + scoped_debug_enter_exit (debug_infcall, "infcall") + +/* Print "infcall" start/end debug statements. */ + +#define INFCALL_SCOPED_DEBUG_START_END(fmt, ...) \ + scoped_debug_start_end (debug_infrun, "infcall", fmt, ##__VA_ARGS__) + +/* Implement 'show debug infcall'. */ + +static void +show_debug_infcall (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + gdb_printf (file, _("Inferior call debugging is %s.\n"), value); +} + /* If we can't find a function's name from its address, we print this instead. */ #define RAW_FUNCTION_ADDRESS_FORMAT "at 0x%s" @@ -529,6 +557,8 @@ call_thread_fsm::call_thread_fsm (struct ui *waiting_ui, bool call_thread_fsm::should_stop (struct thread_info *thread) { + INFCALL_SCOPED_DEBUG_ENTER_EXIT; + if (stop_stack_dummy == STOP_STACK_DUMMY) { /* Done. */ @@ -577,10 +607,17 @@ static struct gdb_exception run_inferior_call (std::unique_ptr<call_thread_fsm> sm, struct thread_info *call_thread, CORE_ADDR real_pc) { + INFCALL_SCOPED_DEBUG_ENTER_EXIT; + struct gdb_exception caught_error; ptid_t call_thread_ptid = call_thread->ptid; int was_running = call_thread->state == THREAD_RUNNING; + infcall_debug_printf ("call function at %s in thread %s, was_running = %d", + core_addr_to_string (real_pc), + call_thread_ptid.to_string ().c_str (), + was_running); + current_ui->unregister_file_handler (); scoped_restore restore_in_infcall @@ -610,15 +647,25 @@ run_inferior_call (std::unique_ptr<call_thread_fsm> sm, proceed (real_pc, GDB_SIGNAL_0); + infrun_debug_show_threads ("non-exited threads after proceed for inferior-call", + all_non_exited_threads ()); + /* Inferior function calls are always synchronous, even if the target supports asynchronous execution. */ wait_sync_command_done (); + + infcall_debug_printf ("inferior call completed successfully"); } catch (gdb_exception &e) { + infcall_debug_printf ("exception while making inferior call (%d): %s", + e.reason, e.what ()); caught_error = std::move (e); } + infcall_debug_printf ("thread is now: %s", + inferior_ptid.to_string ().c_str ()); + /* If GDB has the prompt blocked before, then ensure that it remains so. normal_stop calls async_enable_stdin, so reset the prompt state again here. In other cases, stdin will be re-enabled by @@ -764,6 +811,8 @@ call_function_by_hand_dummy (struct value *function, dummy_frame_dtor_ftype *dummy_dtor, void *dummy_dtor_data) { + INFCALL_SCOPED_DEBUG_ENTER_EXIT; + CORE_ADDR sp; struct type *target_values_type; function_call_return_method return_method = return_method_normal; @@ -830,6 +879,9 @@ call_function_by_hand_dummy (struct value *function, if (args.size () < ftype->num_fields ()) error (_("Too few arguments in function call.")); + infcall_debug_printf ("calling %s", get_function_name (funaddr, name_buf, + sizeof (name_buf))); + /* A holder for the inferior status. This is only needed while we're preparing the inferior function call. */ infcall_control_state_up inf_status (save_infcall_control_state ()); @@ -1276,6 +1328,12 @@ call_function_by_hand_dummy (struct value *function, e = run_inferior_call (std::move (sm_up), call_thread.get (), real_pc); } + if (e.reason < 0) + infcall_debug_printf ("after inferior call, exception (%d): %s", + e.reason, e.what ()); + infcall_debug_printf ("after inferior call, thread state is: %s", + thread_state_string (call_thread->state)); + gdb::observers::inferior_call_post.notify (call_thread_ptid, funaddr); if (call_thread->state != THREAD_EXITED) @@ -1287,6 +1345,8 @@ call_function_by_hand_dummy (struct value *function, { struct value *retval; + infcall_debug_printf ("call completed"); + /* The inferior call is successful. Pop the dummy frame, which runs its destructors and restores the inferior's suspend state, and restore the inferior control @@ -1317,6 +1377,8 @@ call_function_by_hand_dummy (struct value *function, return retval; } + else + infcall_debug_printf ("call did not complete"); /* Didn't complete. Clean up / destroy the call FSM, and restore the previous state machine, and handle the error. */ @@ -1572,4 +1634,10 @@ The default is to unwind the frame."), show_unwind_on_terminating_exception_p, &setlist, &showlist); + add_setshow_boolean_cmd + ("infcall", class_maintenance, &debug_infcall, + _("Set inferior call debugging."), + _("Show inferior call debugging."), + _("When on, inferior function call specific debugging is enabled."), + NULL, show_debug_infcall, &setdebuglist, &showdebuglist); } -- 2.25.4 ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] gdb: add infcall specific debugging 2022-10-06 17:23 ` [PATCH 3/3] gdb: add infcall specific debugging Andrew Burgess @ 2022-10-06 17:32 ` Eli Zaretskii 2022-10-10 12:05 ` Andrew Burgess 0 siblings, 1 reply; 7+ messages in thread From: Eli Zaretskii @ 2022-10-06 17:32 UTC (permalink / raw) To: Andrew Burgess; +Cc: gdb-patches > Date: Thu, 6 Oct 2022 18:23:45 +0100 > From: Andrew Burgess via Gdb-patches <gdb-patches@sourceware.org> > > diff --git a/gdb/NEWS b/gdb/NEWS > index 796a4ef8072..8b519a648f7 100644 > --- a/gdb/NEWS > +++ b/gdb/NEWS > @@ -111,6 +111,10 @@ maintenance print frame-id [ LEVEL ] > Print GDB's internal frame-id for the frame at LEVEL. If LEVEL is > not given, then print the frame-id for the currently selected frame. > > +set debug infcall on|off > +show debug infcall > + Print additional debug messages about inferior function calls. > + This part is OK. > --- a/gdb/doc/gdb.texinfo > +++ b/gdb/doc/gdb.texinfo > @@ -27587,6 +27587,13 @@ > @item show debug infrun > Displays the current state of @value{GDBN} inferior debugging. > > +@item set debug infcall > +@cindex inferior function call debugging info > +Turns on or off display of debugging info related to when @value{GDBN} > +makes inferior function calls. Is the "related to when" part accurate? It seems to imply that we only display indications of such calls, whereas the code seems to do much more: it shows detailed information about the call and its results. So maybe reword as follows: Turns on or off display of debugging info related to inferior function calls made by @value{GDBN}. Thanks. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 3/3] gdb: add infcall specific debugging 2022-10-06 17:32 ` Eli Zaretskii @ 2022-10-10 12:05 ` Andrew Burgess 0 siblings, 0 replies; 7+ messages in thread From: Andrew Burgess @ 2022-10-10 12:05 UTC (permalink / raw) To: Eli Zaretskii; +Cc: gdb-patches Eli Zaretskii <eliz@gnu.org> writes: >> Date: Thu, 6 Oct 2022 18:23:45 +0100 >> From: Andrew Burgess via Gdb-patches <gdb-patches@sourceware.org> >> >> diff --git a/gdb/NEWS b/gdb/NEWS >> index 796a4ef8072..8b519a648f7 100644 >> --- a/gdb/NEWS >> +++ b/gdb/NEWS >> @@ -111,6 +111,10 @@ maintenance print frame-id [ LEVEL ] >> Print GDB's internal frame-id for the frame at LEVEL. If LEVEL is >> not given, then print the frame-id for the currently selected frame. >> >> +set debug infcall on|off >> +show debug infcall >> + Print additional debug messages about inferior function calls. >> + > > This part is OK. > >> --- a/gdb/doc/gdb.texinfo >> +++ b/gdb/doc/gdb.texinfo >> @@ -27587,6 +27587,13 @@ >> @item show debug infrun >> Displays the current state of @value{GDBN} inferior debugging. >> >> +@item set debug infcall >> +@cindex inferior function call debugging info >> +Turns on or off display of debugging info related to when @value{GDBN} >> +makes inferior function calls. > > Is the "related to when" part accurate? It seems to imply that we > only display indications of such calls, whereas the code seems to do > much more: it shows detailed information about the call and its > results. So maybe reword as follows: > > Turns on or off display of debugging info related to inferior > function calls made by @value{GDBN}. Thanks for the feedback. I pushed this series with the fix you suggested. Thanks, Andrew ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/3] Another set of debug output patches 2022-10-06 17:23 [PATCH 0/3] Another set of debug output patches Andrew Burgess ` (2 preceding siblings ...) 2022-10-06 17:23 ` [PATCH 3/3] gdb: add infcall specific debugging Andrew Burgess @ 2022-10-07 19:11 ` Tom Tromey 3 siblings, 0 replies; 7+ messages in thread From: Tom Tromey @ 2022-10-07 19:11 UTC (permalink / raw) To: Andrew Burgess via Gdb-patches >>>>> "Andrew" == Andrew Burgess via Gdb-patches <gdb-patches@sourceware.org> writes: Andrew> More infrun patches (1/3), some thread debug (2/3), and a new debug Andrew> class 'infcall' (3/3). FWIW these all seem fine to me. Tom ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-10-10 12:05 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-10-06 17:23 [PATCH 0/3] Another set of debug output patches Andrew Burgess 2022-10-06 17:23 ` [PATCH 1/3] gdb: improve infrun_debug_show_threads output Andrew Burgess 2022-10-06 17:23 ` [PATCH 2/3] gdb: extra debug output in thread.c Andrew Burgess 2022-10-06 17:23 ` [PATCH 3/3] gdb: add infcall specific debugging Andrew Burgess 2022-10-06 17:32 ` Eli Zaretskii 2022-10-10 12:05 ` Andrew Burgess 2022-10-07 19:11 ` [PATCH 0/3] Another set of debug output patches Tom Tromey
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).