Over the last decade, the speed and complexity of multi-core systems has increased dramatically. At the same time, more applications have demanded lower and lower power consumption, leaving little margin for error in system design and manufacturing. In addition, software, firmware and hardware have become increasingly interdependent. Each must be debugged within the context of the others.