The debugger supports breakpoints and watchpoints, but I had the following issues while using it:
Breakpoints only support exact address matches. Putting a breakpoint on a physical address won't trigger the debugger when that address is executed from a virtual address (most noticeable in the case of a TLB lookup).
Watchpoints only support exact address matches. This is the same issue as described above for breakpoints.
Watchpoints do not support memory accesses via DMA. There are a few DMA controllers in RCP and support is needed for all of them.
Watchpoints only support read/write accesses in 64-bit blocks. It would be nice to allow users to specify an address range that potentially spans multiple blocks. This is essential for DMA support, which has variable length.
Plugins do not notify the emulator of any DMA or direct RDRAM access, which means the RDRAM access from them will ignore the active watchpoints.
IIRC, some components like RDP have direct access to RDRAM without a DMA. But this also includes the hidden bit for the Z-Buffer, which we can probably ignore.
The first two points are the hardest to deal with. A watchpoint on address 0x8000_1000 will not be triggered by accesses to 0xa000_1000. The only difference between these is that the instruction cache is only enabled on the first. They are otherwise backed by the same memory. Another example of where this is a problem is when you only know the physical address for something (e.g. found with the cheat search or from a GameShark code), the watchpoints will not detect a hit when accessed through the TLB (virtual memory).
Address range mirroring has the same problem; accessing memory through a mirror will not be detected by breakpoints/watchpoints.
I had to make local patches to the source code to work around these problems.
The debugger supports breakpoints and watchpoints, but I had the following issues while using it:
The first two points are the hardest to deal with. A watchpoint on address
0x8000_1000
will not be triggered by accesses to0xa000_1000
. The only difference between these is that the instruction cache is only enabled on the first. They are otherwise backed by the same memory. Another example of where this is a problem is when you only know the physical address for something (e.g. found with the cheat search or from a GameShark code), the watchpoints will not detect a hit when accessed through the TLB (virtual memory).Address range mirroring has the same problem; accessing memory through a mirror will not be detected by breakpoints/watchpoints.
I had to make local patches to the source code to work around these problems.