If the savestate were incomplete, the error would have been a native Win32/C++ exception and a failure to load the savestate, complete with a message describing the corrupted section of the savestate. Trap exceptions indicate that the savestate loaded fine, and that the core of the emulator is flawed somehow.
The size of the savestate has nothing to do with the crash. Nearly the only thing that can cause that sort of variety in savestate size is the GS plugin (GS memory makes up the large bulk of the savestate data in most cases) -- and this size can vary greatly from frame to frame of a game.
The crash is most likely related to something in the DMA controller not being saved out at all (in any savestates, working or broken); as thats the most likely source of end-case (rare) crashes. Furthermore, games almost exclusively use Trap instructions for highly unexpected DMA controller statuses (and not much else). What happens is that the DMAC is fully functional with arbitrary or default values for like 95% of all games. Only a few games end up having semi-random crashes if some of those status vars get lost during savestate save/load.
The size of the savestate has nothing to do with the crash. Nearly the only thing that can cause that sort of variety in savestate size is the GS plugin (GS memory makes up the large bulk of the savestate data in most cases) -- and this size can vary greatly from frame to frame of a game.
The crash is most likely related to something in the DMA controller not being saved out at all (in any savestates, working or broken); as thats the most likely source of end-case (rare) crashes. Furthermore, games almost exclusively use Trap instructions for highly unexpected DMA controller statuses (and not much else). What happens is that the DMAC is fully functional with arbitrary or default values for like 95% of all games. Only a few games end up having semi-random crashes if some of those status vars get lost during savestate save/load.
Jake Stine (Air) - Programmer - PCSX2 Dev Team