If you're diving deep enough into CircuitPython's core code, you might be dealing with the chip's peripheral registers. Now, while you can get A LOT done with breakpoints and GDB
Using the same PulseIn issue that has been used throughout this guide, I have been working on a replacement function to capture frequencies better. Aptly, it is named FrequencyIn. The SAMD chips can use their Timer/Counter ("TC") or Timer/Counter for Control Applications ("TCC") to capture frequency periods (and PWM...but that's for a later date). If you're interested, read the datasheet(s).
Moving on.... In order to use the TC peripheral to capture frequency periods, we have to set up the peripheral which is accomplished through the registers/helper functions. These registers are also used to check if a signal has been captured, and to retrieve the captured result. As mentioned, the elusive part is finding out if what we think is happening is actually happening at the register level.
Enter the IO Window!
Its elegantly simple. You can open the IO Window from the Debug->Windows menu. In order to read the peripheral register values, the board must be paused. The values will be updated automatically when pausing the board.
As mentioned earlier in the guide, Atmel Studio is a large program and can be buggy. One thing I constantly encounter when using the IO Window, is the time it takes to update the peripheral register values. There are a lot of them. So, exercise patience when using the IO Window. You will most likely see intermittent "Not Responding" or "Atmel Studio Is Busy" periods, and this dialog window will open:
If you're still looking for register values, click Wait 1 more minute. The dialog window may open more than once before you can get the information you seek.
If you're done looking, click Stop waiting, and AS7 will abandon the process it is trying to accomplish.
As best I can tell, this is all related to communication with the debugger and the backagent program.