Microsoft has provided a number of debuggers. Visual Studio Debugger would be the most widely known one, while there is a less known tool set called Debugging Tools for Windows which is available for free. Even inside Microsoft, there were questions around why having so many debuggers, and which one to use.

A quick answer is, use Visual Studio for everyday user mode software development and put Debugging Tools for Windows aside. Visual Studio has a good feature set, it supports various kinds of debugging target (native, managed, script, interop, Transact-SQL, HLSL, etc.), and has a lot of cool features such like Intellitrace, JMC (Just My Code) and EnC (Edit and Continue). Besides, Visual Studio has a very good user interface, it also hides the low level details that most people wouldn't care.

Debugging Tools for Windows on the other hand, is a set of debuggers which includes WinDBG, a powerful debugger with a graphical interface and a console interface, as well as the console-based debuggers NTSD, CDB, and KD. These Windows debuggers (CDB, KD, NTSD, WinDBG) offer similar debugging capabilities which give you more details, and more control over the target. These debuggers only support native and managed target. Below are a few reasons for using the Windows debuggers instead of Visual Studio:

  1. Kernel debugging
    Visual Studio has no kernel debugging support.
  2. Small footprint
    The Windows debuggers do not require any install, and can run from a share folder over network. Also, CDB and NTSD are pure console applications, the consumption of memory and other resources are much lower than Visual Studio.
  3. System debugging
    NTSD has less demands on the operating system, which makes it ideal for debugging winlogon, services and subsystems.
  4. Non-invasive debugging
    The Windows debuggers can work in a non-invasive mode without attaching to the target. With non-invasive debugging, it's even possible to use the Visual Studio debugger and Windows debuggers cooperatively in a single debug session.
  5. Scripting
    All the Windows debuggers expose their functionality through text commands with many powerful syntax support (sorts like DEBUG command in the era of DOS), making it possible to automate debugging tasks.

What debuggers do you use? Have you had problems while using the Visual Studio Debugger?