Нет, хороший отладчик в режиме Debug (ключ компилятора "-o0") должен показывать всё, что угодно, заходить, куда угодно, а также изменять место исполнения на указанную строку и т.д.
Может Release (типа "-o3") у вас, да все WIZ_* объявлены недостаточно убедительно ?
Можно получить map-файл и увидеть там отдельный адрес функции redirect_data() ?
А также дизассемблерное представление программы, и там 20 команд для неё же присутствуют ?
Даже если заинлайнится функция, отладчик в тексте всё равно ходит по ней, эмулируя юзерскую логику.
Правда, DS-5 у меня сейчас чудит периодически для ARM, но стабильно...
Можно в текущем сеансе переключиться в дизассемблер ? Там пошаговые инструкции исполняются, всё должно быть на ладони.
По-любому, перед вызовом redirect_data() можно в её теле поставить точку останова -- оно ж большое, и если нигде это не удастся, то железно функция опущена оптимизацией, иначе на эту ТО по F11 должно перейти.
Матрёшечность может быть любая -- это личное дело каждого, типа толерантности, ну чуть дольше будет отрабатываться прерывание, мож кому-то от этого хорошо...

Конечно, если 20 уровней вложенности -- такое лучше гасить, вон у MS в драйверах столько мусора наверчено высоко-архитектурного... Не более 1500 обработок за секунду, один из тормозных источников Винд

Главное -- не вызывать в прерывании специально оговоренные функции, типа ожидания семафора, которые могут занять неопределённый период и вообще завести систему в клинч.
Не знаю, относится ли к ним sendto() -- вдруг там внутри семафор для разграничения доступа к общему ресурсу ?
Это надо глядеть документацию на используемую ОС.
А если Baremetal, кучи нитей и мудрёной синхронизации нет, то можно вообще всё.
В переполнение стека не верится -- обе функции детские, переменных локальных кот наплакал, если только внешний поток управления, прерванный прерыванием, очень мощный... Но это нужно глядеть на регистр стека в окне регистров, бывает такое в IDE ? И сравнивать с допустимым диапазоном.