Debug builds tend to generate output that can easily be matched to high-level language constructs. You can identify variables, tests, loops, etc. just by looking at the machine code. You will not get variable names, but this usually refers to the least important considerations when reverse engineering.
The optimized code, OTOH, reorders instructions, expands loops, repeats the use of slots for several variables, divides code blocks between functions, built-in small functions, etc., which makes it difficult to determine the initial intention. It also makes debugging difficult, even if you own the code, as the current line marker is often misleading, and variables tend to disappear or show random crap.
All this makes reverse engineering impossible. It is just more effort to tease the point.
Marcelo cantos
source share