Debugger.Log vs. OutputDebugString
Both Debugger.Log and OutputDebugString have some key similarities:
- The both log string for debugging purposes
- Both have thread-affinity. (The debugger can find out which thread logged)
- Data is piped through with no additional semantics in the debugger pipeline.
But they have some key differences.
| |
mscorlib!System.Diagnostics.Debugger.Log |
kernel32!OutputDebugString |
| Managed? |
Managed |
Native |
| Debug events: |
Managed debug event, see here for how debugger retreives it. |
Native debug event. Retrieved via a OUTPUT_DEBUG_STRING_INFO event |
| Information that's logged |
(level, category string, message string) |
(message string) |
| Activation |
Can be enabled / disabled (enabled from debugger via ICorDebugProcess::EnableLogMessages, and can be checked via Debugger.IsLogging). Debugger must enable to get the messages. |
Always enabled |
| misc |
Calls OutputDebugString with category and message strings. |
|
| Sniffing outside a debugger |
Must be attached as a managed debugger to get the managed log events. (DbMon can still sniff the OutputDebugStrings) |
Events can be sniffed from DbMon even when a debugger is not attached. |
If you're writing managed code, you should probably call Debugger.Log() instead of pinvoke out to OutputDebugString.