1. A method comprising: partitioning a program into one or more blocks of code, wherein any two consecutive lines of code X and Y of said program are placed in the same block if and only if the execution of X implies the execution of both X and Y, albeit not necessarily consecutively; and inserting a probe into each of said blocks of code; wherein the partitioning of said program is based on a partition of the nodes of a control-flow graph G for said program; and wherein the nodes of said control-flow graph G are partitioned by an algorithm that employs a single type of mark to mark nodes.