Как можно отловить случайную багу в embadded проекте?
1. Возможно это блокировки шины памяти.
Они бывают если что-то занимает озу или флешь надолго или уарт очень быстрый, 500кБод и выше.
Классика жанра - прошивка параметров в флеш или самого флеша. Или работа другого канала ДМА на макс скорости.
2. Возможно ошибки приёма уарта, советую глянуть осцилографом стабильность уровней напряжения и временную стабильность фронтов.
3. Баг в коде и порча ОЗУ - советую поменять раскладку памяти, если использовать LD файлы то это прощее, в других более закоренелых системах типа кейла непонятно как. Но метод такой - если перенести буфер уарта на другое место в ОЗУ и всё исправилось то это оно и есть. Можно размер стека изменить, поиграться с размером прочих буферов, массивов и тд.
4. Попытаться покускам поотключать бизнес код.
5. Не использовать RTOS - да фантастика, но очень часто причина в нём. Он не идеален, да даже если он был бы идеален, можно накосячить с его использованием.
6. Неправильно настроенная прочая аппаратура - поотключать левое.
7. Подумать когда возникла ошибка и об обстоятельстве её возникновения, нередко бывает например когда ошибка в ячейке  c смещением 0х13 и тут вспоминаешь что была добавлена стркутура и третий байт массива в этой структуре как раз с смещением 0х13 после вызова уарта меняется ... опа!
Спасибо за рекомендации, 
нашёл багу! 
В кольцевом буфере считал указатель на голову без volatile. Написал так и все заработало как нужно:volatile uint32_t head = REC_BUFF_SZ - this->huart.hdmarx->Instance->NDTR;