1 Introduction
Runtime software monitoring has been used for profiling, performance analysis, software optimization as well as software fault-detection, diagnosis, and recovery. Software-fault detection provides evidence that program behavior complies or does not comply with specified properties during program execution. While other verification techniques, such as testing, model checking, and theorem proving, aim to ensure universal correctness of programs, the intention of runtime software-fault monitoring is to determine whether the current execution preserves specified properties; thus, monitoring can be used to provide additional defense against catastrophic failure and to support testing by exposing state information. The increasing complexity and ubiquitous nature of software systems and the cost and inadequacy of testing [64] has sparked renewed interest in the field.