This is a more intermediate / advanced topic, but there's a way to track down these "hard to reproduce" errors if you don't mind taking the time to add the extra code (done properly, it's a fairly large undertaking).
I'm just throwing it out there to spark your own brainstorming on this topic.
Video Analogy
You can record changed in the state of your game objects, user inputs, and other important data in a file at regular intervals (most likely on every call to Update). This file can then be "played back" within your game engine. "Play" the stream back through your game engine (witin the debugger), and break into the source when / where the problem occurs.
Snapshot
Save a snapshot of all the gamestate data for your game to a file (a single Update, rather than a stream of Update calls). Later, you can reload that state into your engine and resume processing with the debugger attached.
----
The first approach is more suitable to the brickbreaker scenario where a snapshot after-the-fact wouldn't really help. But for most logic bugs, once the game is in a "funky" state, it stays that way. For those cases, the second approach would work just fine, and supporting single-frame game state requires less complicated logic than a stream of game state frames.
It may sound crazy at first glance, but there are parallels in debugging tools -- most notably Microsoft's PIX, which allows you to playback and debug captured GPU states.
-- joe
There are 10 kinds of people in this world -- Those that can count in binary, and those that can't.