Once installed, set
the _NT_SYMBOL_PATH environment variable. I also recommend that
you add the Windbg installation directory to your PATH.
If you're feeling ambitious, you could grab this file and save it to a location that is easy to type. You'll need to type its path when you try to load it later.
cdb for text mode debugging or windbg for GUI-p <pid> command line option.
-z <path-to-dump> to examine a minidump
-o to debug multiple processes with a single debugger
| Command | gdb | windbg | windbg keyboard accelerator | windbg toolbar button | notes |
|---|---|---|---|---|---|
| Continue Execution | c |
g |
F5 | ![]() |
|
| Set breakpoint (address) | break <address> |
bp <address> |
|||
| Set breakpoint (unresolved symbol) | break <location> |
bu <location> |
|||
| Set breakpoint (source line) | break <source line> |
bp `<source line>` |
F9 at caret location | (toggle) |
|
| Set watchpoint | watch/rwatch/awatch |
ba w/r/r |
|||
| Step over | next |
p |
F10 | ![]() |
|
| Step into | step |
t |
F11 | ![]() |
|
| Step out | finish |
gu |
Shift + F11 | ![]() |
|
| List breakpoints | info breakpoints |
bl |
|||
| Disable breakpoint | disable |
bd |
|||
| Enable breakpoint | enable |
be |
|||
| Clear breakpoint | clear |
bc |
F9 at caret location | (toggle) |
|
| Run to location | advance |
pa |
F7 at caret location | ![]() |
|
| Current Thread Backtrace | bt |
k |
Alt + 6 | ![]() |
|
| Switch non-volatile register context to frame | f <frame number> |
.frame /r /c <frame number> |
|||
| List so/dll | info sharedlibrary |
lm |
|||
| List processes | |* |
Alt + 9 | ![]() |
||
| List threads | info threads |
~* |
Alt + 9 | ![]() |
|
| Switch current thread | thread <thread number> |
~<thread number> s |
|||
| Break on .so/.dll load | catch load <regex> |
sxe ld:<module> |
|||
| Ignore signal/exception | handle <signal> nostop |
sxd av |
|||
| Load symbols for module | add-symbol-file |
.reload <module> |
|||
| Local variables in current stack frame | info locals |
dv |
Alt + 3 | ![]() |
|
| Arguments for current stack frame | info args |
kb 1 |
|||
| Symbol lookup | info (functions|variables) <regexp> |
x <module!symbol> |
May use * and ? as glob-style wildcards |
||
| Registers | info registers |
r |
Alt + 4 | ![]() |
|. |
Current process |
|# |
Faulting process |
|* |
All processes |
|<index> |
Process at index |
|~<pid> |
Process by ID |
Note that this syntax is identical to thread syntax except for the fact that it uses | instead of ~
~. |
Current thread |
~# |
Faulting thread |
~* |
All threads |
~<index> |
Thread at index |
~~<tid> |
Thread by ID |
Note that this syntax is identical to process syntax except for the fact that it uses ~ instead of |
This syntax may be used as a prefix to restrict the scope of certain subcommands:
| Command | Description |
|---|---|
f |
Freeze thread |
u |
Thaw thread |
s |
Switch current thread |
~0 bp <address> |
Set a breakpoint to fire only for the main thread |
WARNING: Some thread subcommands may use the same abbreviation as regular commands but have a significantly different meaning!
Example: Freeze all threads except for main thread
~* f
~0 u
(The f command is "fill memory" in non-thread command contexts)
| Command | Description |
|---|---|
!gle |
Get the current thread's "last error" value (Win32 errno) |
!error <code> |
Look up the human-readable description of error code |
!sym noisy |
Debug logging for symbol resolver |
!sym quiet |
Revert to quiet symbol resolution |
!wow64exts.sw |
Switch between 32-bit and 64-bit modes (Windbg 64-bit only) |
.nvload <path-to-natvis-file> |
Load natvis definitions (requires WinDbg 10) |
.dump /mfh <path-to-dump-file> |
Save current debugging state to minidump |
!analyze -hang -v |
Query the kernel to find out why the currently selected thread is hung |
There are three expression evaluators: MASM, C++ and NatVis. MASM is the default. To change the default, see the .expr command.
NatVis is only available with the dx command (see below).
You can also override on a per-expression basis by wrapping your expression with @@masm(...) or @@c++(...).
To immediately evaluate an expression on the command line, use ? for MASM or ?? for C++. References to register names must be prefixed by @. For example:
?? (@eax + 0n15)
Prints the value of eax + 15 (Use 0n prefix for decimal literals)
Old and busted: dt <module!name> <address>
New hotness (WinDbg 10): dx <C++ expression>
.nvload command to load visualizers.