Пишу проект на C++ в Keil, процессор STM32F4**, ось FreeRTOS V8.2.3, менеджер памяти heap_4. Проект сгенерирован в CubeMX.
Столкнулся с ситуацией, когда при обработке исключений на C++ происходит неопределенное поведение.
CODE
class MemTest{
public:
MemTest(){ _p = new char[10000]; }
~MemTest(){ delete _p; }
private:
char * _p;
};
class exc{
public:
exc(){}
~exc(){}
};
/* таска в которой локализую ошибку */
void exception_debug(void const * argument){
while(true){
try{
MemTest mt;
throw exc();
} catch(const exc& e){
osDelay(100);
} catch(...){
osDelay(500);
}
}
vTaskDelete(NULL);
}
Операторы new и delete выглядят так:
CODE
void *operator new(size_t size){
void *p=pvPortMalloc(size);
#ifdef __EXCEPTIONS
if (p==0)
throw std::bad_alloc();
#endif
return p;
}
void operator delete(void *p){
vPortFree( p );
}
Сценарий выполнения выглядит следующим образом:
1. некоторое количество раз (в среднем от 1 до 25) выполняется в цикле try ... catch и мы успешно падаем в блок catch(const exc& e).
2. после последнего удачного раза отработки конструкторов - деструкторов типов MemTest и exc, на следующей итерации, когда я попадаю в деструктор MemTest, выполняю операцию delete и в этот момент у меня выполнение кода передаётся на функцию HAL_TIM_IRQHandler и дальше попадаю в функции HAL для обработки сравнений итп, что касается таймера.
Вопрос такой, как определить в какую сторону копать? У меня есть предположение, что в некоторой ситуации крашится шедулер FreeRTOS. Но отловить в какой именно пока не получилось.
PS1: Я отслеживаю переполнение хипа и стека. Эти хуки не вызываются, из чего можно сделать вывод, что использование памяти не выходит за границы..