3

I have a C# application that uses an external C++ DLL, and for some reason, I can't step into its functions anymore in Visual Studio. I used to be able to, but now, every time I try, I end up in a disassembly inside NTDLL instead of in my C++ function. If I even put a call to DebugBreak() inside the C++ code, I get a bizarre error message like "a breakpoint has been hit that the CLR cannot handle."

I have "Enable native code debugging" turned on in the C# application's debug profile, and I've turned off "Hot Reload" and "Edit and Continue," which sometimes cause trouble for native code debugging, but I still can't step into the C++ code.

Here's my function declaration on the C# side:

[DllImport("Foo.dll"), SuppressGCTransition]
public static extern unsafe void DoSomething();

and here it is on the C++ side:

__declspec(dllexport) void DoSomething()
{
    ...
}

Why can't I step into this function? I'm using Visual Studio 2022, 17.5.3.

Sean Werkema
  • 5,810
  • 2
  • 38
  • 42

1 Answers1

4

The most likely reason why mixed-mode debugging might not work in this case: The [DllImport] attribute you've applied in C# to the imported C/C++ function declares SuppressGCTransition. That may make the call considerably faster, especially if it's a short call, but it also can really freak out the debugger. So if you have something like this in C#:

[DllImport("Foo.dll"), SuppressGCTransition]
public static extern unsafe void DoSomething();

You'll need to change it to the form below, or none of the breakpoints inside DoSomething() will ever be hit, not even calls to DebugBreak().

[DllImport("Foo.dll")]
public static extern unsafe void DoSomething();

Microsoft states plainly that SuppressGCTransition breaks mixed-mode debugging, but it's easy to forget that fact when you're trying to track down why breakpoints aren't working: There have been enough odd glitches in mixed-mode debugging over the years that it's easy to blame Visual Studio when the fault, is, in fact, your own.

(I wasted a lot more time today than I ought to have wasted on this exact issue, so hopefully this answer will help someone avoid wasting that time in the future!)

Sean Werkema
  • 5,810
  • 2
  • 38
  • 42