Let’s say you want to place a breakpoint deep in some leaf code, but only when the user presses a key.
For a more concrete example, my recent refactoring broke collision detection on some parts of the map. I want to be able to point the camera at a broken spot, press a key, and step through the collision routines to see what went wrong. My terrain collision routines use quadtrees and hence are recursive, and I’d like to be able to break fairly close to the leaf nodes to minimise the amount of stepping, but still before the leaf nodes in case anything interesting happens.
Debuggers have conditional breakpoints but I doubt they can express something so complex, and I don’t want to learn another shitty meta language on top of the real programming language I already use which is inevitably different for each debugger I use.
Obviously a simple hack is to add a global variable, but this happens so
often it would be nice to leave them in the entire time. In my case I
extern bool break1; extern bool break2; etc to one of my common
bool break1 = false; bool break2 = false; etc in
breakbools.cc, and added that to my list of common objects.
Then adding the breakpoint I want is very simple. High up in my frame
loop I add
break1 = input->keys[ KEY_T ], and in my collision routine
I add something like
if( break1 && node bounding box is sufficiently
small ) asm( "int $3" ), and it does exactly what I want. (for MSVC you
__debugbreak(); instead of int 3)