[llvm-branch-commits] [lldb] [lldb-dap] fix crash if disconnect request is not sent. (PR #148878)
Ebuka Ezike via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jul 15 09:02:09 PDT 2025
https://github.com/da-viper created https://github.com/llvm/llvm-project/pull/148878
It crashes because the event_thread and progress_event_thread not joined before calling `DAP` struct deconstructor.
It now joins when we leave the `DAP::Loop` function.
from [Discourse](https://discourse.llvm.org/t/is-lldb-dap-usable/87320)
>From 3dcb5fffc21e9f9c44f4d03b4ee0cc27c8cfd9d2 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 15 Jul 2025 16:56:03 +0100
Subject: [PATCH] [lldb-dap] fix crash if disconnect request is not sent.
It crashes because the event_thread and progress_event_thread not joined before calling DAP struct deconstructor.
It now joins when we leave the main loop.
---
lldb/tools/lldb-dap/DAP.cpp | 12 ++++++++++++
lldb/tools/lldb-dap/lldb-dap.cpp | 9 ---------
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index a67abe582abd4..134ddaa4c8f59 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -22,6 +22,7 @@
#include "lldb/lldb-defines.h"
#include "lldb/lldb-enumerations.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/ScopeExit.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/Error.h"
@@ -224,6 +225,16 @@ llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) {
void DAP::StopIO() {
out.Stop();
err.Stop();
+
+ if (event_thread.joinable()) {
+ broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread);
+ event_thread.join();
+ }
+
+ if (progress_event_thread.joinable()) {
+ broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread);
+ progress_event_thread.join();
+ }
}
// Send the JSON in "json_str" to the "out" stream. Correctly send the
@@ -794,6 +805,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) {
}
llvm::Error DAP::Loop() {
+ auto stop_io = llvm::make_scope_exit([this]() { StopIO(); });
while (!disconnecting) {
llvm::json::Object object;
lldb_dap::PacketStatus status = GetNextObject(object);
diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp
index 9e0e7f21ce4fc..02688fc858f6b 100644
--- a/lldb/tools/lldb-dap/lldb-dap.cpp
+++ b/lldb/tools/lldb-dap/lldb-dap.cpp
@@ -1096,15 +1096,6 @@ void request_disconnect(DAP &dap, const llvm::json::Object &request) {
}
SendTerminatedEvent(dap);
dap.SendJSON(llvm::json::Value(std::move(response)));
- if (dap.event_thread.joinable()) {
- dap.broadcaster.BroadcastEventByType(eBroadcastBitStopEventThread);
- dap.event_thread.join();
- }
- if (dap.progress_event_thread.joinable()) {
- dap.broadcaster.BroadcastEventByType(eBroadcastBitStopProgressThread);
- dap.progress_event_thread.join();
- }
- dap.StopIO();
dap.disconnecting = true;
}
More information about the llvm-branch-commits
mailing list