Das Projekt aufteilen und die einzelnen Teile debuggen. Das gilt für alle Projekte.
Ob JTAG für das Herumstochern im Nebel hilfreich ist, kann ich nicht sagen. Gerade in der Kommunikation kann man keine Breakpoints setzen, wenn der andere Rechner nicht ebenfalls gestoppt werden kann.
Also einmal die Kommunikation testen, die Ansteuerung des Neopixels testen, und dann beide Programmteile zusammenfügen. Am besten von Anfang an alles in einem Programm entwickeln und mit #defines die einzelnen Teile und den Debug-Code ein/aus schalten.
Wozu?