Issue 133904
Summary [lldb] [Windows] Lldb-dap crashes when trying to step over breakpoint
Labels
Assignees
Reporter ktraunmueller
    I have a [swift-winrt](https://github.com/thebrowsercompany/swift-winrt) based Windows desktop app.

Debugging works fine in the app executable, but when trying to step over (some, not all) breakpoints in other modules (see `Package.swift` below), the debugger crashes (reproducibly every time) with

```
Assertion failed: Out.empty(), file D:\r\_work\swift-build\swift-build\SourceCache\llvm-project\llvm\lib\Support\ConvertUTFWrapper.cpp, line 85
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.	Program arguments: E:\\Swift\\Toolchains\\0.0.0+Asserts\\usr\\bin\\lldb-dap.exe
Exception Code: 0x80000003
 #0 0x00007ff7caa94b10 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x64b10)
 #1 0x00007ffb5b47b030 (C:\WINDOWS\System32\ucrtbase.dll+0x7b030)
 #2 0x00007ffb5b47bc3c (C:\WINDOWS\System32\ucrtbase.dll+0x7bc3c)
 #3 0x00007ffb5b47d5d4 (C:\WINDOWS\System32\ucrtbase.dll+0x7d5d4)
 #4 0x00007ffb5b47cbe0 (C:\WINDOWS\System32\ucrtbase.dll+0x7cbe0)
 #5 0x00007ffb5b47d70c (C:\WINDOWS\System32\ucrtbase.dll+0x7d70c)
 #6 0x00007ffa86d13628 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\liblldb.dll+0xcd3628)
 #7 0x00007ffa86a94108 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\liblldb.dll+0xa54108)
 #8 0x00007ffa862fc978 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\liblldb.dll+0x2bc978)
 #9 0x00007ff7caa6bfa0 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x3bfa0)
#10 0x00007ff7caa520bc (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x220bc)
#11 0x00007ff7caa5be08 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x2be08)
#12 0x00007ff7caa5c220 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x2c220)
#13 0x00007ff7caa55240 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x25240)
#14 0x00007ff7caaa84e4 (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x784e4)
#15 0x00007ff7caaa857c (E:\Swift\Toolchains\0.0.0+Asserts\usr\bin\lldb-dap.exe+0x7857c)
#16 0x00007ffb5d4a8740 (C:\WINDOWS\System32\KERNEL32.DLL+0x8740)
#17 0x00007ffb600d0eb4 (C:\WINDOWS\SYSTEM32\ntdll.dll+0xd0eb4)
```

`lldb` command-line debugging is mostly working fine, so it looks this is an issue in the toolchain's `lldb-dap` debug adapter, not some general problem with my debugger setup.

Unfortunately I haven't found more clues on how to reproduce or narrow this down. I also can't share the source code, and I don't have a minimal reproducing example :(

Environment:
- Windows 11 arm64
  - I also tested on an x64 machine (same Swift toolchain version), and it was exactly the same crash as on arm64.
- VS Code with swiftlang.swift-vscode Version 2.0.2
- current [TBC Swift toolchain](https://github.com/thebrowsercompany/swift-build/releases/tag/20250310.3)

I was [searching for code in LLVM](https://github.com/search?q=repo%3Allvm%2Fllvm-project%20convertUTF16ToUTF8String&type=code) that calls the assertion-throwing `convertUTF16ToUTF8String()` function in `ConvertUTFWrapper.cpp`

```
Assertion failed: Out.empty(), file D:\r\_work\swift-build\swift-build\SourceCache\llvm-project\llvm\lib\Support\ConvertUTFWrapper.cpp, line 85
```

and found [this candidate](https://github.com/llvm/llvm-project/blob/b01e5b23dd880e9686cc4151c7d1b1737cbdd98e/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp#L195), where `m_name` may be the `std::string` that is expected to be empty (but is not) when `convertUTF16ToUTF8String()` is called: 
```cpp
llvm::convertUTF16ToUTF8String(
 llvm::ArrayRef(reinterpret_cast<char *>(pszThreadName),
 wcslen(pszThreadName) * sizeof(wchar_t)),
        m_name);
```

Maybe a simple
```
m_name = "";
```
before the call to `convertUTF16ToUTF8String()` would fix the problem.

<details>
<summary>The app's Package.swift</summary>

```
// swift-tools-version: 6.2

import PackageDescription

let GUILinkerSettings: [LinkerSetting] = [
    .unsafeFlags(["-Xlinker", "/SUBSYSTEM:WINDOWS"], .when(configuration: .release)),
    // Update the entry point to point to the generated swift function, this lets us keep the same main method
    // for debug/release
    .unsafeFlags(["-Xlinker", "/ENTRY:mainCRTStartup"], .when(configuration: .release)),
]

let package = Package(
    name: "Compositor-Windows",
    products: [
 .executable(
            name: "Compositor",
            targets: ["Compositor"]),
    ],
    dependencies: [
        // .package(url: "https://github.com/ktraunmueller/swift-cwinrt", branch: "main"),
 // .package(url: "https://github.com/ktraunmueller/swift-uwp", branch: "main"),
        // .package(url: "https://github.com/ktraunmueller/swift-windowsfoundation", branch: "main"),
        // .package(url: "https://github.com/ktraunmueller/swift-windowsappsdk", branch: "main"),
        // .package(url: "https://github.com/ktraunmueller/swift-winui", branch: "main"),
 // .package(url: "https://github.com/ktraunmueller/swift-plugins", branch: "main")
        .package(path: "../../../winrt/swift-cwinrt"),
 .package(path: "../../../winrt/swift-uwp"),
        .package(path: "../../../winrt/swift-win2d"),
        .package(path: "../../../winrt/swift-windowsappsdk"),
        .package(path: "../../../winrt/swift-windowsfoundation"),
        .package(path: "../../../winrt/swift-winui"),
        .package(path: "../Core")
 ],
    targets: [
        .executableTarget(
            name: "Compositor",
            dependencies: [
                .product(name: "CompositorCore", package: "Core"),
                .product(name: "CWinRT", package: "swift-cwinrt"),
                .product(name: "UWP", package: "swift-uwp"),
                .product(name: "Win2D", package: "swift-win2d"),
                .product(name: "WinAppSDK", package: "swift-windowsappsdk"),
                .product(name: "WindowsFoundation", package: "swift-windowsfoundation"),
 .product(name: "WinUI", package: "swift-winui"),
            ],
 swiftSettings: [.interoperabilityMode(.Cxx)],
 linkerSettings: GUILinkerSettings
        ),
    ],
 swiftLanguageModes: [.v5]
)
```
</details>
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to