Open
Description
Description
- Write a .NET 8 application that calls a native library using P/Invoke with a callback.
- Run the app, then attach the dotnet debugger before the callback is called.
- Visual Studio Managed (.NET Core for Unix): https://learn.microsoft.com/en-us/visualstudio/debugger/remote-debugging-dotnet-core-linux-with-ssh?view=vs-2022#attach-the-debugger
- JetBrains Rider: https://www.jetbrains.com/help/rider/SSH_Remote_Debugging.html#debug-application-on-remote-machine
- We'll see an output "Trace/Breakpoint Trap" and the app crashes.
Note: Not all native callbacks cause this issue so I've written a minimal reproducible example below.
Reproduction Steps
Minimal reproducible example 1:
- Clone this repo: https://github.com/walterlv/Walterlv.Issues.TraceBreakpointTrap
- build the demo to a linux machine
- Run the app, then attach the dotnet debugger.
dotnet publish -c debug -r linux-x64 --self-contained
$ ./TraceBreakpointTrapDemo
### Trace/Breakpoint Trap issue on .NET debugger ###
Please attach a dotnet debugger and use 'Set next statement'.
Trace/breakpoint trap
Reproducible example 2:
Expected behavior
The app should not crash when the dotnet debugger is attached.
Actual behavior
The app crashes with an output "Trace/Breakpoint Trap".
Regression?
I've only tested this on .NET 8.0.302
Known Workarounds
I've found several workarounds:
- Detect if the debugger is attached and don't call the callback.
- Use the "Native (GDB)" or "Native (LLDB)" debugger instead of the "Managed (.NET Core for Unix)" debugger.
Note:
- The
Debugger.IsAttached
property cannot detect the native debugger so I added alternative options--sleep <seconds>
and--skip-attach
for the minimal reproducible example above. - The native debugger is very difficult to use, so I hope this issue can be fixed.
Configuration
- .NET: 8.0.302
- OS:
- Ubuntu 22.04 LTS
- Debian 12
- UnionTech OS GNU/Linux 20
- Kylin V10 SP1
- Architecture:
- x64
- ARM64
I didn't find any environment that doesn't have this issue.
Other information
dotnet tool install -g dotnet-sos
dotnet sos install
ulimit -c unlimited
- Run
echo "0x3F"> /proc/<pid>/coredump_filter
after the process starts and the pid is known. - Attach the debugger and wait for the output
Trace/Breakpoint Trap (core dumped)
. lldb --core core TraceBreakpointTrapDemo
$ lldb --core core TraceBreakpointTrapDemo
SOS_HOSTING: Failed to find runtime directory
Unrecognized command 'setsymbolserver' because managed hosting failed or was disabled. See sethostruntime command for details.
(lldb) target create "TraceBreakpointTrapDemo" --core "core"
Core file '/home/uos/lvyi/Walterlv.Issue.TraceBreakpointTrap/core' (x86_64) was loaded.
(lldb) clrstack
OS Thread Id: 0x7ef9 (1)
Child SP IP Call Site
00007F4AF37DBA38 00007F4AF45F3B41 Walterlv.Issues.TraceBreakpointTrap.VolumeManager.ContextStateCallback(IntPtr, IntPtr)
(lldb) bt
* thread #1, name = 'TraceBreakpoint', stop reason = signal SIGTRAP
* frame #0: 0x00007f4af45f3b41
frame #1: 0x00007f4b6ba904f9 libpulse.so.0`___lldb_unnamed_symbol12$$libpulse.so.0 + 73
frame #2: 0x00007f4b6ba93002 libpulse.so.0`___lldb_unnamed_symbol28$$libpulse.so.0 + 514
frame #3: 0x00007f4b6ba931d2 libpulse.so.0`___lldb_unnamed_symbol29$$libpulse.so.0 + 98
frame #4: 0x00007f4b6ba459b2 libpulsecommon-14.2.so`___lldb_unnamed_symbol101$$libpulsecommon-14.2.so + 258
frame #5: 0x00007f4b6baa63c0 libpulse.so.0`pa_mainloop_dispatch + 672
frame #6: 0x00007f4b6baa65cc libpulse.so.0`pa_mainloop_iterate + 60
frame #7: 0x00007f4b6baa6670 libpulse.so.0`pa_mainloop_run + 32
frame #8: 0x00007f4b6bab43f9 libpulse.so.0`___lldb_unnamed_symbol111$$libpulse.so.0 + 105
frame #9: 0x00007f4b6ba51628 libpulsecommon-14.2.so`___lldb_unnamed_symbol119$$libpulsecommon-14.2.so + 88
frame #10: 0x00007f4b73452fa3 libpthread.so.0`start_thread(arg=<unavailable>) at pthread_create.c:486
frame #11: 0x00007f4b7305d60f libc.so.6`__GI___clone at clone.S:95
(lldb) dis
-> 0x7f4af45f3b41: subq $0x20, %rsp
0x7f4af45f3b45: leaq 0x20(%rsp), %rbp
0x7f4af45f3b4a: movq %rdi, -0x8(%rbp)
0x7f4af45f3b4e: movq %rsi, -0x10(%rbp)
0x7f4af45f3b52: movq %rdx, -0x18(%rbp)
0x7f4af45f3b56: cmpl $0x0, 0x897d3(%rip)
0x7f4af45f3b5d: je 0x7f4af45f3b64
(lldb)