BACH: a hardware monitor for tracing microprocessor-based systems