While there are great options mentioned here, I would actually be suggesting that you stick to a very good systems book. A standing knowledge of lower level systems and instruction code will give great depth to your debugging skills. Nothing teaches reverse engineering better than experience.
At CMU, we used CS:APP (Computer Systems: A Programmer's Perspective). It's written by Randy Bryant, the same professor who used to teach it. I still have that book, it's updated for Ivy Bridge, and I truly believe that this book changed my approach towards debugging more than any other text. It will push you to the next curve.
Towards the end of the book you'd find some programming labs. I highly suggest you do them religiously. Many great men have failed at them.