aboutsummaryrefslogtreecommitdiff
path: root/gdb/python/py-dap.c
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2024-02-22 11:35:26 +0100
committerTom de Vries <tdevries@suse.de>2024-02-22 11:35:26 +0100
commit05bf17f03b890424312163463754de63cee73074 (patch)
tree3cda5bb491daeeae0bbbee7b5fbd61394d076882 /gdb/python/py-dap.c
parent67cf0bd885e3862fb77de0039208d39cc89dba91 (diff)
downloadbinutils-05bf17f03b890424312163463754de63cee73074.zip
binutils-05bf17f03b890424312163463754de63cee73074.tar.gz
binutils-05bf17f03b890424312163463754de63cee73074.tar.bz2
[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 <tom@tromey.com> PR dap/31386 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31386
Diffstat (limited to 'gdb/python/py-dap.c')
-rw-r--r--gdb/python/py-dap.c23
1 files changed, 20 insertions, 3 deletions
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<ui_out> 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 ()