Understanding Dynamic Software Behavior with Tools for Retroactive Investigation