1. A method of diagnosing software failures in a computing device that manifest themselves when the computing device executes instructions, said method comprising: (a) gathering data reflecting the state of the operating system of the computing device; (b) gathering data reflecting the state of software components coupled to the operating system; (c) retrieving rules suitable for identifying the cause of software failures; and (d) applying said rules to said gathered data to identify software failures in said computing device.