Задать вопрос

Возможно ли локализовать нарушение структур в памяти?

Есть большой проект, в в котором появилась ошибка, источник которой не очевиден. Прошу помощи знатоков.
Суть проблемы: при выполнении кода вылетает системное исключение Floating Point Error (Domain или Overflow) в месте, где нет операций с плавающей запятой - получаем строку, выходим из функции с возвратом строки и ловим исключение не войдя в родительскую функцию.
Есть подозрение, что в коде есть некорректный код который при записи в память залезает на соседние структуры и портит их. Возможно ли локализовать место нарушения?
Немного дополнительной информации по проблеме. Ошибка гарантированно появляется при использовании функции вывода сообщения (логическая функция, без работы с железом), но появляется она совсем в другом месте. Вначале вызывается объект менеджер задач, который в бесконечном цикле вызывает другие объекты-задачи. И вылетает на конкретной задаче, которая раньше (и до запуска вывода сообщения и в предыдущих версиях программы) работала без сбоев. да и исключений работы с плавающей запятой у этого объекта-задачи быть не должно.
Программа написана на С++ под работу в DOS и в итоге должна выполнятся на ПЛК на основе 16-битного процессора Intel 80188. Именно там и появляется ошибка. Для отладки приложения используется исходный код скомпилированный под ПК, на котором данную проблему пока не словил в виде исключения, но если есть в исходном коде некорректность, то и на ПК она тоже должна проявляться (утечки памяти?).
Прошу совета, как выявить проблему? Использовать профилировщики, статические анализаторы кода? Пока не приходилось с ними работать. Они могут помочь в поиске места нарушения структур памяти?
  • Вопрос задан
  • 2605 просмотров
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@RPG
Самое первое - прогнать программу через valgrind (можно на обычной машине). Ищите "Invalid read of size..." или Invalid write - это и будут ошибки памяти. Ну и утечки возможно появятся.
Второе - посмотреть внимательно код, где есть деление (операторы / и %) и проверить, возможно ли там деление на ноль - FPE может оказаться банальным следствием деления на ноль.
Ответ написан
softmart
@softmart
Разработчик
В таких случаях обычно использую метод поимки программистом льва в пустыне.
Убираю код по частям и проверяю, есть ли ошибка. Таким образом выявляется сбойный участок.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы