diff options
author | Tom de Vries <tdevries@suse.de> | 2024-02-22 11:35:26 +0100 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2024-02-22 11:35:26 +0100 |
commit | 05bf17f03b890424312163463754de63cee73074 (patch) | |
tree | 3cda5bb491daeeae0bbbee7b5fbd61394d076882 /gdb/python/py-dap.c | |
parent | 67cf0bd885e3862fb77de0039208d39cc89dba91 (diff) | |
download | binutils-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.c | 23 |
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 () |