X86 debug registers (DR0-3, DR6, DR7) are also useful. They don't require code changes. As an added bonus, you can set a breakpoint for a variable access, which triggers whenever a certain variable is accessed.
Although unfortunately debug registers are limited to just 4 simultaneous breakpoints in the same time.
Something like http://www.cs.columbia.edu/~junfeng/09sp-w4118/lectures/int3...