From 05bf17f03b890424312163463754de63cee73074 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 22 Feb 2024 11:35:26 +0100 Subject: [gdb/dap] Fix race between dap startup and dap log file In dap_gdb_start we do: ... append GDBFLAGS " -iex \"set debug dap-log-file $logfile\" -q -i=dap" ... While the dap log file setting comes before the dap interpreter setting, the order is the other way around: - first, the dap interpreter is started - second, the -iex commands are executed and the log file is initialized. Consequently, there's a race between dap interpreter startup and dap log file initialization. This cannot be fixed by using -eiex instead. Before the interpreter is started, the "set debug dap-log-file" command is not yet registered. Fix this by postponing the start of the DAP server until GDB has processed all command files. Tested on aarch64-linux. Approved-By: Tom Tromey PR dap/31386 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31386 --- gdb/python/py-dap.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'gdb/python/py-dap.c') diff --git a/gdb/python/py-dap.c b/gdb/python/py-dap.c index 5757c15..2034105 100644 --- a/gdb/python/py-dap.c +++ b/gdb/python/py-dap.c @@ -61,13 +61,18 @@ public: return m_ui_out.get (); } + void pre_command_loop () override; + private: std::unique_ptr m_ui_out; }; -void -dap_interp::init (bool top_level) + +/* Call function FN_NAME from module gdb.dap. */ + +static void +call_dap_fn (const char *fn_name) { gdbpy_enter enter_py; @@ -75,18 +80,30 @@ dap_interp::init (bool top_level) if (dap_module == nullptr) gdbpy_handle_exception (); - gdbpy_ref<> func (PyObject_GetAttrString (dap_module.get (), "run")); + gdbpy_ref<> func (PyObject_GetAttrString (dap_module.get (), fn_name)); if (func == nullptr) gdbpy_handle_exception (); gdbpy_ref<> result_obj (PyObject_CallObject (func.get (), nullptr)); if (result_obj == nullptr) gdbpy_handle_exception (); +} + +void +dap_interp::init (bool top_level) +{ + call_dap_fn ("run"); current_ui->input_fd = -1; current_ui->m_input_interactive_p = false; } +void +dap_interp::pre_command_loop () +{ + call_dap_fn ("pre_command_loop"); +} + void _initialize_py_interp (); void _initialize_py_interp () -- cgit v1.1