As an example of the challenge, My first task in the job was to port a ROM monitor to a custom StrongARM board. StrongARM had JTAG, but no run control, therefore, I could load and run code, but could not stop it or look at memory.
At first, I could only observe (with my eyes) when the board resets. Soon, I could toggle 4 LEDs on the board. That was enough for me to debug by streaming values one nybble at a time. Soon after, I could emit characters from the serial port.
That was the good old days.