Skip to content

Commit 81898ac

Browse files
committed
Revert "[lldb-dap] Ensure the IO forwarding threads are managed by the DAP object lifecycle. (#120457)"
This reverts commit 0d9cf26. Breaks the lldb-aarch64-windows buildbot.
1 parent 1160994 commit 81898ac

File tree

7 files changed

+157
-314
lines changed

7 files changed

+157
-314
lines changed

lldb/tools/lldb-dap/CMakeLists.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
if ( CMAKE_SYSTEM_NAME MATCHES "Windows" OR CMAKE_SYSTEM_NAME MATCHES "NetBSD" )
2+
list(APPEND extra_libs lldbHost)
3+
endif ()
4+
15
if (HAVE_LIBPTHREAD)
26
list(APPEND extra_libs pthread)
37
endif ()
@@ -22,23 +26,22 @@ add_lldb_tool(lldb-dap
2226
lldb-dap.cpp
2327
Breakpoint.cpp
2428
BreakpointBase.cpp
25-
DAP.cpp
2629
ExceptionBreakpoint.cpp
2730
FifoFiles.cpp
2831
FunctionBreakpoint.cpp
29-
InstructionBreakpoint.cpp
3032
IOStream.cpp
3133
JSONUtils.cpp
3234
LLDBUtils.cpp
3335
OutputRedirector.cpp
3436
ProgressEvent.cpp
3537
RunInTerminal.cpp
3638
SourceBreakpoint.cpp
39+
DAP.cpp
3740
Watchpoint.cpp
41+
InstructionBreakpoint.cpp
3842

3943
LINK_LIBS
4044
liblldb
41-
lldbHost
4245
${extra_libs}
4346

4447
LINK_COMPONENTS

lldb/tools/lldb-dap/DAP.cpp

Lines changed: 26 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -6,62 +6,34 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include <chrono>
10+
#include <cstdarg>
11+
#include <fstream>
12+
#include <mutex>
13+
914
#include "DAP.h"
1015
#include "JSONUtils.h"
1116
#include "LLDBUtils.h"
12-
#include "OutputRedirector.h"
13-
#include "lldb/API/SBBreakpoint.h"
1417
#include "lldb/API/SBCommandInterpreter.h"
15-
#include "lldb/API/SBCommandReturnObject.h"
1618
#include "lldb/API/SBLanguageRuntime.h"
1719
#include "lldb/API/SBListener.h"
18-
#include "lldb/API/SBProcess.h"
1920
#include "lldb/API/SBStream.h"
20-
#include "lldb/Host/FileSystem.h"
21-
#include "lldb/Utility/Status.h"
22-
#include "lldb/lldb-defines.h"
23-
#include "lldb/lldb-enumerations.h"
24-
#include "llvm/ADT/ArrayRef.h"
2521
#include "llvm/ADT/StringExtras.h"
26-
#include "llvm/ADT/Twine.h"
27-
#include "llvm/Support/Error.h"
28-
#include "llvm/Support/ErrorHandling.h"
2922
#include "llvm/Support/FormatVariadic.h"
30-
#include "llvm/Support/raw_ostream.h"
31-
#include <algorithm>
32-
#include <cassert>
33-
#include <chrono>
34-
#include <cstdarg>
35-
#include <cstdio>
36-
#include <fstream>
37-
#include <mutex>
38-
#include <utility>
3923

4024
#if defined(_WIN32)
4125
#define NOMINMAX
4226
#include <fcntl.h>
4327
#include <io.h>
4428
#include <windows.h>
45-
#else
46-
#include <unistd.h>
4729
#endif
4830

4931
using namespace lldb_dap;
5032

51-
namespace {
52-
#ifdef _WIN32
53-
const char DEV_NULL[] = "nul";
54-
#else
55-
const char DEV_NULL[] = "/dev/null";
56-
#endif
57-
} // namespace
58-
5933
namespace lldb_dap {
6034

61-
DAP::DAP(llvm::StringRef path, std::ofstream *log, ReplMode repl_mode,
62-
StreamDescriptor input, StreamDescriptor output)
63-
: debug_adaptor_path(path), log(log), input(std::move(input)),
64-
output(std::move(output)), broadcaster("lldb-dap"),
35+
DAP::DAP(llvm::StringRef path, ReplMode repl_mode)
36+
: debug_adaptor_path(path), broadcaster("lldb-dap"),
6537
exception_breakpoints(), focus_tid(LLDB_INVALID_THREAD_ID),
6638
stop_at_entry(false), is_attach(false),
6739
enable_auto_variable_summaries(false),
@@ -71,7 +43,21 @@ DAP::DAP(llvm::StringRef path, std::ofstream *log, ReplMode repl_mode,
7143
configuration_done_sent(false), waiting_for_run_in_terminal(false),
7244
progress_event_reporter(
7345
[&](const ProgressEvent &event) { SendJSON(event.ToJSON()); }),
74-
reverse_request_seq(0), repl_mode(repl_mode) {}
46+
reverse_request_seq(0), repl_mode(repl_mode) {
47+
const char *log_file_path = getenv("LLDBDAP_LOG");
48+
#if defined(_WIN32)
49+
// Windows opens stdout and stdin in text mode which converts \n to 13,10
50+
// while the value is just 10 on Darwin/Linux. Setting the file mode to binary
51+
// fixes this.
52+
int result = _setmode(fileno(stdout), _O_BINARY);
53+
assert(result);
54+
result = _setmode(fileno(stdin), _O_BINARY);
55+
UNUSED_IF_ASSERT_DISABLED(result);
56+
assert(result);
57+
#endif
58+
if (log_file_path)
59+
log.reset(new std::ofstream(log_file_path));
60+
}
7561

7662
DAP::~DAP() = default;
7763

@@ -187,45 +173,6 @@ ExceptionBreakpoint *DAP::GetExceptionBreakpoint(const lldb::break_id_t bp_id) {
187173
return nullptr;
188174
}
189175

190-
llvm::Error DAP::ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr) {
191-
in = lldb::SBFile(std::fopen(DEV_NULL, "r"), /*transfer_ownership=*/true);
192-
193-
if (auto Error = out.RedirectTo([this](llvm::StringRef output) {
194-
SendOutput(OutputType::Stdout, output);
195-
}))
196-
return Error;
197-
198-
if (overrideOut) {
199-
auto fd = out.GetWriteFileDescriptor();
200-
if (auto Error = fd.takeError())
201-
return Error;
202-
203-
if (dup2(*fd, fileno(overrideOut)) == -1)
204-
return llvm::errorCodeToError(llvm::errnoAsErrorCode());
205-
}
206-
207-
if (auto Error = err.RedirectTo([this](llvm::StringRef output) {
208-
SendOutput(OutputType::Stderr, output);
209-
}))
210-
return Error;
211-
212-
if (overrideErr) {
213-
auto fd = err.GetWriteFileDescriptor();
214-
if (auto Error = fd.takeError())
215-
return Error;
216-
217-
if (dup2(*fd, fileno(overrideErr)) == -1)
218-
return llvm::errorCodeToError(llvm::errnoAsErrorCode());
219-
}
220-
221-
return llvm::Error::success();
222-
}
223-
224-
void DAP::StopIO() {
225-
out.Stop();
226-
err.Stop();
227-
}
228-
229176
// Send the JSON in "json_str" to the "out" stream. Correctly send the
230177
// "Content-Length:" field followed by the length, followed by the raw
231178
// JSON bytes.
@@ -261,19 +208,19 @@ std::string DAP::ReadJSON() {
261208
std::string json_str;
262209
int length;
263210

264-
if (!input.read_expected(log, "Content-Length: "))
211+
if (!input.read_expected(log.get(), "Content-Length: "))
265212
return json_str;
266213

267-
if (!input.read_line(log, length_str))
214+
if (!input.read_line(log.get(), length_str))
268215
return json_str;
269216

270217
if (!llvm::to_integer(length_str, length))
271218
return json_str;
272219

273-
if (!input.read_expected(log, "\r\n"))
220+
if (!input.read_expected(log.get(), "\r\n"))
274221
return json_str;
275222

276-
if (!input.read_full(log, length, json_str))
223+
if (!input.read_full(log.get(), length, json_str))
277224
return json_str;
278225

279226
if (log) {

lldb/tools/lldb-dap/DAP.h

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,36 @@
99
#ifndef LLDB_TOOLS_LLDB_DAP_DAP_H
1010
#define LLDB_TOOLS_LLDB_DAP_DAP_H
1111

12-
#include "DAPForward.h"
13-
#include "ExceptionBreakpoint.h"
14-
#include "FunctionBreakpoint.h"
15-
#include "IOStream.h"
16-
#include "InstructionBreakpoint.h"
17-
#include "OutputRedirector.h"
18-
#include "ProgressEvent.h"
19-
#include "SourceBreakpoint.h"
20-
#include "lldb/API/SBBroadcaster.h"
21-
#include "lldb/API/SBCommandInterpreter.h"
22-
#include "lldb/API/SBDebugger.h"
23-
#include "lldb/API/SBError.h"
24-
#include "lldb/API/SBFile.h"
25-
#include "lldb/API/SBFormat.h"
26-
#include "lldb/API/SBFrame.h"
27-
#include "lldb/API/SBTarget.h"
28-
#include "lldb/API/SBThread.h"
29-
#include "lldb/API/SBValue.h"
30-
#include "lldb/API/SBValueList.h"
31-
#include "lldb/lldb-types.h"
12+
#include <cstdio>
13+
#include <iosfwd>
14+
#include <map>
15+
#include <optional>
16+
#include <thread>
17+
3218
#include "llvm/ADT/DenseMap.h"
3319
#include "llvm/ADT/DenseSet.h"
3420
#include "llvm/ADT/StringMap.h"
3521
#include "llvm/ADT/StringRef.h"
36-
#include "llvm/Support/Error.h"
3722
#include "llvm/Support/JSON.h"
3823
#include "llvm/Support/Threading.h"
39-
#include <map>
40-
#include <mutex>
41-
#include <optional>
42-
#include <thread>
43-
#include <vector>
24+
#include "llvm/Support/raw_ostream.h"
25+
26+
#include "lldb/API/SBAttachInfo.h"
27+
#include "lldb/API/SBCommandInterpreter.h"
28+
#include "lldb/API/SBCommandReturnObject.h"
29+
#include "lldb/API/SBDebugger.h"
30+
#include "lldb/API/SBEvent.h"
31+
#include "lldb/API/SBFormat.h"
32+
#include "lldb/API/SBLaunchInfo.h"
33+
#include "lldb/API/SBTarget.h"
34+
#include "lldb/API/SBThread.h"
35+
36+
#include "ExceptionBreakpoint.h"
37+
#include "FunctionBreakpoint.h"
38+
#include "IOStream.h"
39+
#include "InstructionBreakpoint.h"
40+
#include "ProgressEvent.h"
41+
#include "SourceBreakpoint.h"
4442

4543
#define VARREF_LOCALS (int64_t)1
4644
#define VARREF_GLOBALS (int64_t)2
@@ -140,18 +138,15 @@ struct SendEventRequestHandler : public lldb::SBCommandPluginInterface {
140138

141139
struct DAP {
142140
llvm::StringRef debug_adaptor_path;
143-
std::ofstream *log;
144141
InputStream input;
145142
OutputStream output;
146-
lldb::SBFile in;
147-
OutputRedirector out;
148-
OutputRedirector err;
149143
lldb::SBDebugger debugger;
150144
lldb::SBTarget target;
151145
Variables variables;
152146
lldb::SBBroadcaster broadcaster;
153147
std::thread event_thread;
154148
std::thread progress_event_thread;
149+
std::unique_ptr<std::ofstream> log;
155150
llvm::StringMap<SourceBreakpointMap> source_breakpoints;
156151
FunctionBreakpointMap function_breakpoints;
157152
InstructionBreakpointMap instruction_breakpoints;
@@ -203,23 +198,13 @@ struct DAP {
203198
// will contain that expression.
204199
std::string last_nonempty_var_expression;
205200

206-
DAP(llvm::StringRef path, std::ofstream *log, ReplMode repl_mode,
207-
StreamDescriptor input, StreamDescriptor output);
201+
DAP(llvm::StringRef path, ReplMode repl_mode);
208202
~DAP();
209203
DAP(const DAP &rhs) = delete;
210204
void operator=(const DAP &rhs) = delete;
211205
ExceptionBreakpoint *GetExceptionBreakpoint(const std::string &filter);
212206
ExceptionBreakpoint *GetExceptionBreakpoint(const lldb::break_id_t bp_id);
213207

214-
/// Redirect stdout and stderr fo the IDE's console output.
215-
///
216-
/// Errors in this operation will be printed to the log file and the IDE's
217-
/// console output as well.
218-
llvm::Error ConfigureIO(std::FILE *overrideOut, std::FILE *overrideErr);
219-
220-
/// Stop the redirected IO threads and associated pipes.
221-
void StopIO();
222-
223208
// Serialize the JSON value into a string and send the JSON packet to
224209
// the "out" stream.
225210
void SendJSON(const llvm::json::Value &json);

lldb/tools/lldb-dap/IOStream.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,6 @@ struct StreamDescriptor {
5252
struct InputStream {
5353
StreamDescriptor descriptor;
5454

55-
explicit InputStream(StreamDescriptor descriptor)
56-
: descriptor(std::move(descriptor)) {}
57-
5855
bool read_full(std::ofstream *log, size_t length, std::string &text);
5956

6057
bool read_line(std::ofstream *log, std::string &line);
@@ -65,9 +62,6 @@ struct InputStream {
6562
struct OutputStream {
6663
StreamDescriptor descriptor;
6764

68-
explicit OutputStream(StreamDescriptor descriptor)
69-
: descriptor(std::move(descriptor)) {}
70-
7165
bool write_full(llvm::StringRef str);
7266
};
7367
} // namespace lldb_dap

0 commit comments

Comments
 (0)