The that produces the synchronization points after the
main method has been exited during replay, thread 9, is called “DestroyJavaVM”. It appears for the first time immediately after the
main method is left.
I also realized why these sync points don’t show up during recording: Recording happens in blocks, and a block only gets sent to the master VM when the buffer is full, when the
main method is entered or exited. These eight sync points in the “DestroyJavaVM” thread can’t be pushed to the master VM anymore since
main has already been left, the buffer doesn’t get full anymore, and when the application terminates (
VMDeathEvent event) the data is not accessible anymore — the client VM is already dead.
This is not a catastrophe, though. It simply means that we cannot guarantee that sync points are recorded properly after the
main method has been left. That may require some code to be rewritten, but a simple
join() to wait until other threads have died will do the trick. There are other ways to fix this: For example, after the
main method has been exited, the buffer size could be set to 1, forcing the client VM to push the buffer at every sync point. I’m not sure if this is necessary, but it’s worthwhile to keep it in mind.
There is another implication that’s more important, though: The replay program has to let the client VM run without monitoring if the schedule ends prematurely. In the current case, the last eight sync points by “DestroyJavaVM” are not present in the schedule, but we have to let the client VM execute them nonetheless. Also, not a biggie.
One secret (thread 9) has been investigated. Now I’m off to a more serious debugging to find the source of the sync points at the beginning…