I was just thinking about the representation again. I think the representation with the two hash maps is right, but now I’m worried about inconsistencies between the data I keep and the data I get from JPDA. Right now, I update my data in the hash maps. Maybe I should always replace my data with fresh, guaranteed-to-be-accurate data from JPDA whenever I get it. I think for now I’ll just add a few assertions to find out if inconsistencies occur.
While I was mulling this over, I had an idea why getting the stack frames of the threads may crash the VM after I’ve added in instrumentation of synchronized blocks: Whenever I instrument synchronized blocks, I change bytecode in a lot of places. Maybe I change the line number information that goes along with the bytecode incorrectly? I know that I do attempt to change it, but I should definitely go over it again.