Personally, I would say to pick a specific implementation instance and debug it.
Let me use a button as an example.
If you have a button, say, Subscribe, attach your debugger where execution will go immediately upon click. Follow the path by stepping into (not over) the base implementation(s). Stop along the way if there are any calls that you do not understand what it is doing or why.
I most scenarios, there is common functionality that all objects would need. All buttons need to do x, y, z. All forms need to validate a, b, c, and forms of this specific type also need to validate d.
Usually the tradeoff in complexity upon first learning the code base is offset by the ease of extensibility once you are familiar with it.
This is really the only answer. You will always be afraid to use something you are unfamiliar with or don’t trust. Command line is very useful and quick once you learn it.