================ @@ -5030,47 +5045,81 @@ int main(int argc, char *argv[]) { } #endif + std::unique_ptr<std::ofstream> log = nullptr; + const char *log_file_path = getenv("LLDBDAP_LOG"); + if (log_file_path) + log.reset(new std::ofstream(log_file_path)); + // Initialize LLDB first before we do anything. lldb::SBDebugger::Initialize(); // Terminate the debugger before the C++ destructor chain kicks in. auto terminate_debugger = llvm::make_scope_exit([] { lldb::SBDebugger::Terminate(); }); - DAP dap = DAP(program_path.str(), default_repl_mode); - - RegisterRequestCallbacks(dap); - - // stdout/stderr redirection to the IDE's console - int new_stdout_fd = SetupStdoutStderrRedirection(dap); - + StreamDescriptor input; + StreamDescriptor output; + std::FILE *redirectOut = nullptr; + std::FILE *redirectErr = nullptr; if (portno != -1) { printf("Listening on port %i...\n", portno); - SOCKET socket_fd = AcceptConnection(dap, portno); - if (socket_fd >= 0) { - dap.input.descriptor = StreamDescriptor::from_socket(socket_fd, true); - dap.output.descriptor = StreamDescriptor::from_socket(socket_fd, false); - } else { + SOCKET socket_fd = AcceptConnection(log.get(), portno); + if (socket_fd < 0) return EXIT_FAILURE; - } + + input = StreamDescriptor::from_socket(socket_fd, true); + output = StreamDescriptor::from_socket(socket_fd, false); } else { - dap.input.descriptor = StreamDescriptor::from_file(fileno(stdin), false); - dap.output.descriptor = StreamDescriptor::from_file(new_stdout_fd, false); +#if defined(_WIN32) + // Windows opens stdout and stdin in text mode which converts \n to 13,10 + // while the value is just 10 on Darwin/Linux. Setting the file mode to + // binary fixes this. + int result = _setmode(fileno(stdout), _O_BINARY); + assert(result); + result = _setmode(fileno(stdin), _O_BINARY); + UNUSED_IF_ASSERT_DISABLED(result); + assert(result); +#endif - /// used only by TestVSCode_redirection_to_console.py - if (getenv("LLDB_DAP_TEST_STDOUT_STDERR_REDIRECTION") != nullptr) - redirection_test(); + int stdout_fd = DuplicateFileDescriptor(fileno(stdout)); + if (stdout_fd == -1) { + llvm::errs() << "Failed to configure stdout redirect: " + << lldb_private::Status::FromErrno().takeError() << "\n"; + return EXIT_FAILURE; + } + + redirectOut = stdout; + redirectErr = stderr; + + input = StreamDescriptor::from_file(fileno(stdin), false); + output = StreamDescriptor::from_file(stdout_fd, false); } + DAP dap = DAP(program_path.str(), log.get(), default_repl_mode, + std::move(input), std::move(output)); + + // stdout/stderr redirection to the IDE's console + if (auto Err = dap.ConfigureIO(redirectOut, redirectErr)) { + llvm::errs() << "Failed to configure lldb-dap IO operations: " << Err ---------------- ashgti wrote:
Done. https://github.com/llvm/llvm-project/pull/120457 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits