A debugging feature that I recommend implementing is a "frame advance" function. This is a common feature in classic console emulators that allow input recordings for the purpose of developing tool-assisted speedruns. Essentially, you pause the update loop, and press a key to run the next pass of the update loop exactly once. This was really helpful for me in developing a platformer project, as it let me more easily study the effects of a collision response on the frame of the collision.
I implemented this by having a "DebugPause" flag, toggled by pressing a key while in "GameDebugMode" in the game. In the DebugPause state, the update loop is exited immediately after listening for input, essentially freezing everything in place while still rendering graphics. Then, if the "DebugFrameAdvance" key is hit, the remainder of the update loop is called exactly once. This way, you can hold the desired keys down for input, hit the DebugFrameAdvance key, and observe how the game responds on a particular frame. Combined with some kind of collision box display, you can see the details of how the physics in your game works in slow-motion. Also, while paused, you can set a breakpoint somewhere inside your update loop, and it won't be called until your next frame advance!
Note that my game used a fixed time-step, so I think some additional trickery will have to be put in place if you have a variable time step.
I hope this helps, and good luck!