You might try instrumenting bochs, which might both run your code faster, require less hardware and give you more accurate results. In many ways, bochs is much better built for the type of thing you want.
If bochs doesn't do enough, it would probably be easier to hack it up to do what you need.
edit: grammar
[1] http://software.intel.com/en-us/articles/pin-a-dynamic-binar...
I don't want to be working at that level every day but it sure was a fun project.
Oh, OS courses at the university... good old time. (Some participants complained that going from zero to bare-metal x86 was too difficult.)
Honestly, when I'm debugging hardware where I have the high level specifications, the microarchitecture spec and the system verilog files that implemented the design it's still kind of a pain to trace things.
The other downside of having all the signals is that little things can be unintentionally misleading. As an example I was working with coworker trying to trace a memory transaction through some complicated logic blocks and there was a point we originally missed where the bottom few bits of an address aren't necessary for the hardware. Later after this point the bottom bits were reused to communicate transaction properties along with the significant address bits. There was a bit of confusion about why we were reading a "bad address" before we realized what happened.