This is going to sound like a flippant response and it really isn't, but pretty much any debugger would do (I use gdb but lldb should handle it also). You could throw an __asm__("trap\n") in your code and you'll drop into the debugger at that point, from which you can single step and look at the registers as you go along.