1. A method of providing a program state of an application, the method comprising: identifying one or more root objects of the application; traversing the one or more root objects of the application and at least one related object of at least one of the root objects, wherein for each root object and each related object the traversing operation discovers a state for each object to produce state discovery results; determining output semantics for each object, based on the state discovery results; and generating a state description of the application based on the state discovery results and the output semantics.