I spent the past few weeks debugging Microsoft Excel.
This was my first time intensely debugging through such a massive codebase, and
I learned a few tricks along the way. These tips will largely be common sense
for seasoned developers, but may be useful for someone who’s seriously debugging for the
first time.
Use the Immediate Window
The Immediate window allows you to call functions, while
your program is frozen at a breakpoint. This is useful when you call debugging
functions that print out data for critical variables, as opposed to manually inspecting those variables themselves.
This is especially true when you’re working in a heavily
object-oriented codebase, and you’ll need to sift through multiple objects in
order to inspect important variables. Just have a function do that for you.
Skip Lines of Code
In the Visual Studio Debugger, you can drag the next
statement cursor to another line of code. This is obviously useful for forcing
the program through a specific code path – entering one if statement rather than another.
But this is also useful for tracing down the exact source of
a bug. By setting the next statement cursor, you can skip lines of code. If
skipping a line of code stops a being from repro-ing, that line of code (and
the functions called on that line) may be worth investigating.
It absolutely isn’t always the case, but it could give good
insight into how a function changes the program state. Skipping lines of code
also happens to be a good way of seeing how well your program handles errors.
Inspect Memory
This is a critical tool for tracking down potential data
corruption. Using the memory window, you can inspect values stored at memory
addresses, and view them in binary, hex, and ASCII format. Memory inspection won’t
be useful for every situation, but when you need to see your data at a low
level, it will be your best friend.
Label your Breakpoints
Visual Studio lets you label your breakpoints – this is incredibly
useful when you’re investigating multiple potential sources for a bug.
Labelling your breakpoints lets you separate your breakpoints into groups. For
example, Shipment Processing makes
more sense than ShipmentController.cpp
Line 64