You can discern a lot of information about an API from what appear to be subtle or irrelevant details
For example, each ICorDebug object has a logical parent. (See here for a brief explanation of the different ICorDebug interfaces). Here's a chart:
ICorDebugProcess ICorDebugThread ICorDebugChain ICorDebugFrame, ICorDebugILFrame, ICorDebugNativeFrame ICorDebugAppDomain ICorDebugAssembly ICorDebugModule ICorDebugClass ICorDebugFunction ICorDebugCode ICorDebugBreakpoint ICorDebugType ICorDebugStepper
ICorDebugValue may have a variety of parents depending on what value it is representing: global (static) variables, thread-locals, app-domain locals, and local variables, can all have different parents.
So what?Overall, that may seem like very boring trivia. If you think about what each of these interfaces represent, the grouping should make sense. However, this demonstrates some key relationships in the APIs. For example:
Considering other possibilities:As a further thought experiment, imagine making a random mutation in the tree above, and then thinking out what the ramifications of that decision would be. For example, if you pushed ICDType up to be a child of ICDProcess, then that would imply that Types could spawn multiple appdomains, and that would change a lot of rules about how AppDomains and serialization work. If you pushed ICDThread down under an AppDomain, that would imply threads are trapped inside an AppDomain.