1. A method of instrumenting a software program, having a plurality of locations and an operating state when executed, with at least one probe function adapted to record information on the operating state at a location within the software program, the method comprising modifying the software program to cause a wrapper function to execute, the wrapper function comprising at least one computer-executable instruction that causes the probe function to execute, wherein modifying the software program comprises: identifying a first location in a first function to be instrumented within the software program, the first function being distinct from the probe function and the wrapper function; determining whether the first location is an entry point of the first function; when the first location is an entry point of the first function: identifying an instruction in the software program that causes the first function to execute; replacing in the software program the instruction that causes the first function to execute with an instruction that causes the wrapper function to execute; and including within the wrapper function an instruction that causes the first function to execute; determining whether the first location is an exit point of the first function; and when the first location is an exit point of the first function: identifying an instruction in the software program that is in the first function and that causes an instruction at a target location to execute; replacing in the software program the identified instruction with an instruction that causes the wrapper function to execute; and including within the wrapper function an instruction that causes the instruction at the target location to execute.