The easiest designs are turn-sequenced games with clearly defined stopping points. All you do is store the game state at the stopping points. This involves nothing more than the standard save game routine that you would implement anyway. The only trick is that you set up a rotating save with, say, three steps in the rotation. In other words, you save Turn 1 to BlackBoxFile1, Turn 2 to BlackBoxFile2, Turn 3 to BlackBoxFile3, Turn 4 to BlackBoxFile1, Turn 5 to BlackBoxFile2, and so on.
Black boxes are most difficult to implement in games with lots of realtime play.
The best that can be done is to set up the black box in RAM, and then copy it to the hard disk every 60 seconds. This can seriously interfere with gameplay, but testers aren't there to have fun. Moreover, if the rat is so serious that it generates a crash, then replicating the problem can be difficult. You do this with a simple compiler flag. All through testing you leave the black box code in place.