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