mikejsavage.co.uk • About • Archive • RSS • Thanks for blocking ads! Blocking ads owns: AdGuard for Safari / uBlock Origin for everything else
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
added extern bool break1; extern bool break2; etc
to one of my common
headers, put bool break1 = false; bool break2 = false; etc
in
breakbools.cc
, and added that to my list of common objects.
(2024 update: you can just do inline bool break1 = false;
in a header
now)
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
need __debugbreak();
instead of int 3)