To slightly expand on Ricardo Acras's answer, stepping through code with a debugger can be real help. Also, getting someone knows how the code works to step through it with you or doing a code review works well.
Fixing bugs and refactoring code are ideal tasks for learning a code base, especially if backed up by a comprehensive test suite to show you the error of your ways. It's a sort of learn by doing approach.
I wouldn't add comments to the code itself, unless you save off a personal copy. Notes written by newcomers often appear naive to people who have worked with a codebase for any amount of time. On the other hand, a reverse engineered design document will often be warmly welcomed.
If you are new to the language the code is written in, you'll have a doubly hard task. Poking around simpler examples, especially those that actually use language idioms, will give you some necessary background.