Interop-debugging (mixed-mode) is managed + native debugging combined.
Well, sort of.
Native and managed debugging have very different paradigms. Native debugging tends to own the whole process, while managed debugging tends to require control of the whole process while only exposing a managed view to the user. So some functionality restrictions were needed to get the two to coexist peacefully.
Most of these are either: a) consequences of the architecture or b) missing features. They’re not little things that could be fixed in a service pack. I’ll ignore issues like bugs, stability, performance impact, etc here.
Here are some features that work in Native debugging that aren’t available in Interop-debugging:
(This is not guaranteed to be a complete list.)
- Native data-breakpoints. While managed-debugging doesn’t support data-breakpoints, native-debugging does. However, interop-debugging does things that interfere with how native-debugging data-breakpoints work.
- You can’t debug the native portion of the runtime (mscorwks.dll). (See here). This includes native code in some profiler callbacks, as well as assembly-stepping through certain transition stubs.
- You can’t detach.
- Interop-debugging is x86-only. We don’t yet have interop-debugging support for all platforms that the CLR runs on (ia64, amd64). Other CLR implementations (Compact FX, Spot) don’t have interop-debugging either.
- Conservatively, you can’t use interop-debugging with AppVerifier. AV tends to transforms that are fine for a native-only debugger but too aggressive for interop-debugging.
- Debugging code in certain “privileged” places such as the Vectored Exception Handler or under certain locks like the Loader-lock or the process heap lock may hang. This is just very risky and deadlock prone because the helper thread may take these locks.
- The debugger is restricted to ICorDebug::CreateProcess and so it can’t use any fancy CreateProcess* functions in kernel32 like CreateProcessAsUser.
- Interop-debugging can’t auto-attach to child debuggee processes. (see here)
- No dump-debugging. Managed-dump debugging isn’t supported. Interop-debugging for dumps without managed-dump support would be little (any?) value add beyond native dump support.
Restrictions on managed-debugging:
- Can’t do managed Edit-and-Continue (EnC). (see here)
The bottom line is that interop-debugging is not just a superset of managed or native-debugging.