I spent a good two hours trying to narrow down a crash in CS:S DM on Windows. Unhelpfully, it would only crash in Release mode, making debugging very difficult.
Finally I narrowed it down to the value of the esi register being corrupted, instead of being saved, by a call. Why? Dig up the “dropgate.asm” file I posted in the first Non-Virtual Function Hooking article:
push edi push esi ; [...] pop edi pop esi
Oops. Right intention, but wrong order. The registers were essentially being swapped, and after the call, their values were completely wrong.
Lesson learned from this bug: Always, always, verify that you are restoring registers in the correct, reverse order.