Skip to content

[lldb-dap][windows] allow STDIN to be a console#178642

Merged
charles-zablit merged 1 commit into
llvm:mainfrom
charles-zablit:charles-zablit/lldb/reland-f1235bd
Jan 29, 2026
Merged

[lldb-dap][windows] allow STDIN to be a console#178642
charles-zablit merged 1 commit into
llvm:mainfrom
charles-zablit:charles-zablit/lldb/reland-f1235bd

Conversation

@charles-zablit
Copy link
Copy Markdown
Contributor

This patch allows starting lldb-dap from the console on Windows.

On Windows, the console is a device of type FILE_TYPE_CHAR and lldb-dap was only allowing devices of type FILE_TYPE_PIPE. This was causing a startup error when running lldp-dap from the console with no arguments.

Fixes #178194

This is a reland of #178409. Adding --allow-empty to the tests allows them to pass in CI. I was not hitting the CI error at desk because lldb-dap was printing warnings, which are not present in CI.

@llvmbot
Copy link
Copy Markdown
Member

llvmbot commented Jan 29, 2026

@llvm/pr-subscribers-platform-windows

@llvm/pr-subscribers-lldb

Author: Charles Zablit (charles-zablit)

Changes

This patch allows starting lldb-dap from the console on Windows.

On Windows, the console is a device of type FILE_TYPE_CHAR and lldb-dap was only allowing devices of type FILE_TYPE_PIPE. This was causing a startup error when running lldp-dap from the console with no arguments.

Fixes #178194

This is a reland of #178409. Adding --allow-empty to the tests allows them to pass in CI. I was not hitting the CI error at desk because lldb-dap was printing warnings, which are not present in CI.


Full diff: https://github.com/llvm/llvm-project/pull/178642.diff

2 Files Affected:

  • (modified) lldb/source/Host/windows/MainLoopWindows.cpp (+1-1)
  • (added) lldb/test/Shell/DAP/TestSTDINConsole.test (+62)
diff --git a/lldb/source/Host/windows/MainLoopWindows.cpp b/lldb/source/Host/windows/MainLoopWindows.cpp
index b4ca2735f1549..d86d41c845fe9 100644
--- a/lldb/source/Host/windows/MainLoopWindows.cpp
+++ b/lldb/source/Host/windows/MainLoopWindows.cpp
@@ -247,7 +247,7 @@ MainLoopWindows::RegisterReadObject(const IOObjectSP &object_sp,
         callback};
   } else {
     DWORD file_type = GetFileType(waitable_handle);
-    if (file_type != FILE_TYPE_PIPE) {
+    if (file_type != FILE_TYPE_CHAR && file_type != FILE_TYPE_PIPE) {
       error = Status::FromErrorStringWithFormat("Unsupported file type %ld",
                                                 file_type);
       return nullptr;
diff --git a/lldb/test/Shell/DAP/TestSTDINConsole.test b/lldb/test/Shell/DAP/TestSTDINConsole.test
new file mode 100644
index 0000000000000..ba2357d1b0fe4
--- /dev/null
+++ b/lldb/test/Shell/DAP/TestSTDINConsole.test
@@ -0,0 +1,62 @@
+# REQUIRES: python, system-windows
+# RUN: %python %s %lldb-dap > %t.out 2>&1
+# RUN: FileCheck %s --check-prefix=ERROR --allow-empty < %t.out
+
+# ERROR-NOT: DAP session error:
+
+# Test that we can successfully start the dap server from the console on Windows.
+
+import sys
+import subprocess
+import os
+
+lldb_dap_path = sys.argv[1]
+if lldb_dap_path.startswith('%'):
+    lldb_dap_path = lldb_dap_path[1:]
+lldb_dap_path = os.path.normpath(lldb_dap_path)
+
+import ctypes
+from ctypes import wintypes
+import msvcrt
+
+GENERIC_READ = 0x80000000
+GENERIC_WRITE = 0x40000000
+OPEN_EXISTING = 3
+FILE_SHARE_READ = 0x00000001
+FILE_SHARE_WRITE = 0x00000002
+
+kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)
+
+conin_handle = kernel32.CreateFileW(
+    "CONIN$",
+    GENERIC_READ | GENERIC_WRITE,
+    FILE_SHARE_READ | FILE_SHARE_WRITE,
+    None,
+    OPEN_EXISTING,
+    0,
+    None
+)
+
+if conin_handle == -1:
+    print("Failed to open CONIN$", file=sys.stderr)
+    sys.exit(1)
+
+conin_fd = msvcrt.open_osfhandle(conin_handle, os.O_RDONLY)
+
+proc = subprocess.Popen(
+    [lldb_dap_path],
+    stdin=conin_fd,
+    stdout=subprocess.PIPE,
+    stderr=subprocess.STDOUT
+)
+
+os.close(conin_fd)
+
+try:
+    output, _ = proc.communicate(timeout=2)
+except subprocess.TimeoutExpired:
+    proc.kill()
+    output, _ = proc.communicate()
+
+sys.stdout.buffer.write(output)
+sys.stdout.flush()

@charles-zablit charles-zablit merged commit e17374a into llvm:main Jan 29, 2026
12 of 13 checks passed
@github-project-automation github-project-automation Bot moved this from Needs Triage to Done in LLVM Release Status Jan 29, 2026
@charles-zablit charles-zablit deleted the charles-zablit/lldb/reland-f1235bd branch January 29, 2026 12:20
@charles-zablit
Copy link
Copy Markdown
Contributor Author

/cherry-pick e17374a

@llvmbot
Copy link
Copy Markdown
Member

llvmbot commented Jan 29, 2026

/pull-request #178646

c-rhodes pushed a commit to llvmbot/llvm-project that referenced this pull request Jan 30, 2026
honeygoyal pushed a commit to honeygoyal/llvm-project that referenced this pull request Jan 30, 2026
charles-zablit added a commit to charles-zablit/llvm-project that referenced this pull request Feb 4, 2026
charles-zablit added a commit that referenced this pull request Feb 9, 2026
#178642 added
`lldb/test/Shell/DAP/TestSTDINConsole.test` with an incorrect
`%lldb-dap` expansion. This patch fixes it.
charles-zablit added a commit to charles-zablit/llvm-project that referenced this pull request Feb 9, 2026
…180237)

llvm#178642 added
`lldb/test/Shell/DAP/TestSTDINConsole.test` with an incorrect
`%lldb-dap` expansion. This patch fixes it.

(cherry picked from commit dbbea96)
llvm-sync Bot pushed a commit to arm/arm-toolchain that referenced this pull request Feb 9, 2026
…-dap (#180237)

llvm/llvm-project#178642 added
`lldb/test/Shell/DAP/TestSTDINConsole.test` with an incorrect
`%lldb-dap` expansion. This patch fixes it.
rishabhmadan19 pushed a commit to rishabhmadan19/llvm-project that referenced this pull request Feb 9, 2026
…180237)

llvm#178642 added
`lldb/test/Shell/DAP/TestSTDINConsole.test` with an incorrect
`%lldb-dap` expansion. This patch fixes it.
charles-zablit added a commit to charles-zablit/llvm-project that referenced this pull request Apr 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Development

Successfully merging this pull request may close these issues.

[lldb-dap][windows] fails to startup on Windows when using the stdin as input

3 participants