Firstly, I wouldn't think about fixing the bugs until I understood how the project worked.
Beyond that, I'd pick up the common uses of the code, and trace through the execution path this would entail (either by just looking at the code, or by stepping through a debugger; both have their own advantages). Once you've done this for a few cases, you'll likely have a good "feel" for the layout of the code, which classes/packages form the important business logic, which ones are trivial audit functionality, or simple data containers, etc.
Then I'd either look at the test cases to pick up the definition of individual methods if they exist - or more likely, try to write test cases based on the execution paths I've just seen. This will teach you a little bit about using the API, and if you use the inputs/outputs you've been tracing then you have a mini regression test right there, to ensure that future modifications don't change this behaviour. (Of course, check that the behaviour you're observing isn't the erroneous one you need to fix!)
I think alternatively between these two steps at progressively finer levels of detail should do the trick. First read/*watch* to see what things do, then write tests to cement this in your mind and check you've understood the API correctly. If you have a good bug report with reproducible test cases, and the expected output, then the first run through the code should give you a good feel for which modules are responsible for the bit that goes wrong. Tracing slowly through those modules, checking the state at every point until you see "good" go to "bad" shouldn't take long, and then you have the cause of the error.
Your third step is possibly the hardest; without a full, over-arching undertanding of the system it's difficult to feel confident that you're not breaking something else. IDEs' "Find Usages"-type capability will help a lot here, to let you know what's depending on something, but they're not infallible (e.g. reflection-based uses, or calls from other source trees). At this point, come up with a solution you believe is OK, and ask other more experienced developers to code review it for problems. They ought to know whether there are any external dependencies, something you can hardly be expected to take into account at this point and with insufficient documentation.