From 6b01403b25c0eb6ce9e7b2e3cc6f5da674089e72 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 2 Oct 2020 14:44:40 -0400 Subject: gdb: add debug prints in event loop Add debug printouts about event loop-related events: - When a file descriptor handler gets invoked - When an async event/signal handler gets invoked gdb/ChangeLog: * async-event.c (invoke_async_signal_handlers): Add debug print. (check_async_event_handlers): Likewise. * event-top.c (show_debug_event_loop): New function. (_initialize_event_top): Register "set debug event-loop" setting. gdbserver/ChangeLog: * server.cc (handle_monitor_command): Handle "set debug-event-loop". (captured_main): Handle "--debug-event-loop". (monitor_show_help): Mention new setting. (gdbserver_usage): Mention new flag. gdbsupport/ChangeLog: * event-loop.h (debug_event_loop): New variable declaration. (event_loop_debug_printf_1): New function declaration. (event_loop_debug_printf): New macro. * event-loop.cc (debug_event_loop): New variable. (handle_file_event): Add debug print. (event_loop_debug_printf_1): New function. Change-Id: If78ed3a69179881368e7895b42940ce13b6a1a05 --- gdb/async-event.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) (limited to 'gdb/async-event.c') diff --git a/gdb/async-event.c b/gdb/async-event.c index 55be014..4228dfb 100644 --- a/gdb/async-event.c +++ b/gdb/async-event.c @@ -157,8 +157,23 @@ create_async_signal_handler (sig_handler_func * proc, for some event. The caller of this function is the interrupt handler associated with a signal. */ void -mark_async_signal_handler (async_signal_handler * async_handler_ptr) +mark_async_signal_handler (async_signal_handler *async_handler_ptr) { + if (debug_event_loop != debug_event_loop_kind::OFF) + { + /* This is called by signal handlers, so we print it "by hand" using + the async-signal-safe methods. */ + const char head[] = ("[event-loop] mark_async_signal_handler: marking" + "async signal handler `"); + gdb_stdlog->write_async_safe (head, strlen (head)); + + gdb_stdlog->write_async_safe (async_handler_ptr->name, + strlen (async_handler_ptr->name)); + + const char tail[] = "`\n"; + gdb_stdlog->write_async_safe (tail, strlen (tail)); + } + async_handler_ptr->ready = 1; serial_event_set (async_signal_handlers_serial_event); } @@ -168,6 +183,8 @@ mark_async_signal_handler (async_signal_handler * async_handler_ptr) void clear_async_signal_handler (async_signal_handler *async_handler_ptr) { + event_loop_debug_printf ("clearing async signal handler `%s`", + async_handler_ptr->name); async_handler_ptr->ready = 0; } @@ -211,6 +228,8 @@ invoke_async_signal_handlers (void) /* Async signal handlers have no connection to whichever was the current UI, and thus always run on the main one. */ current_ui = main_ui; + event_loop_debug_printf ("invoking async signal handler `%s`", + async_handler_ptr->name); (*async_handler_ptr->proc) (async_handler_ptr->client_data); } @@ -274,6 +293,8 @@ create_async_event_handler (async_event_handler_func *proc, void mark_async_event_handler (async_event_handler *async_handler_ptr) { + event_loop_debug_printf ("marking async event handler `%s`", + async_handler_ptr->name); async_handler_ptr->ready = 1; } @@ -282,6 +303,8 @@ mark_async_event_handler (async_event_handler *async_handler_ptr) void clear_async_event_handler (async_event_handler *async_handler_ptr) { + event_loop_debug_printf ("clearing async event handler `%s`", + async_handler_ptr->name); async_handler_ptr->ready = 0; } @@ -300,6 +323,8 @@ check_async_event_handlers () if (async_handler_ptr->ready) { async_handler_ptr->ready = 0; + event_loop_debug_printf ("invoking async event handler `%s`", + async_handler_ptr->name); (*async_handler_ptr->proc) (async_handler_ptr->client_data); return 1; } -- cgit v1.1