What I sometimes don't realize early enough, in testing and debugging strange behavior is that the code may not have ever worked the way the person expected.
I had a need to implement some fairly trivial case folding in C (I was/am a noob at C). The code was meant to check a policy database to see if something was allowed or denied. Some policy decisions were deemed critical and therefore hard coded, and they happened to be the easiest ones to test with so I changed one character of each case and expected it to fail the static check and move on to the database lookup. After an hour of testing without a debugger and reviewing only my code that changed, I broke out GDB and noticed where the problem was. The code that I assumed working was broken. The code had an || where an && was desired in an optimization to avoid comparing the strings if the length wasn't the same.
If I had added a character, I would have never noticed the bug.