How Debuggers Work: Algorithms, Data Structures, and Architecture