2013-03-19 3 views
1

Существует странная проблема с некоторым кодом, с которым я работаю: Насколько я знаю и насколько я проверял, в коде нет компонентов, которые полагаются на что-нибудь случайное, например, на систему времени и т. д. Однако достаточно просто добавить точку останова в коде и поведение изменений программы. Он не делает ничего плохого, он просто ведет себя по-другому (в коде есть несколько объектов, которые должны быть выбраны некоторым значением, которое равно 0 для всех из них - он просто выбирает другой объект, где значение равно 0 при добавлении точек останова) , К сожалению, невозможно отправить любой код, потому что его слишком много.Добавление изменений контрольных точек изменения поведения программы

Что может вызывать такое поведение?

Редактировать: Я потратил еще некоторое время на проблему: он, похоже, не связан с точками останова - самый простой способ получения разных результатов заключается в следующем: при запуске процесса отладки от другого. cpp-файл проекта, выход уже меняется. При отключении «Сборка автоматически» этого больше не происходит. В заключение я заключаю, что даже если в коде нет изменений, что-то перестраивается. Я также сузил его до класса, который на самом деле вызывает различное поведение: это реализация кубика фибоначчи.

+0

Полностью необъяснимое поведение часто (обычно?) Означает, что некоторые из вашего кода имеют неопределенное поведение, но точно, что и где невозможно угадать, без кода, на который нужно смотреть. Я бы * не * отверг это, хотя - странное, но безобидное поведение не всегда остается безвредным. –

+1

Является ли это целью выбора серверных объектов и выполнения его в другом порядке или одного из нескольких объектов и выбора другого. В любом случае оптимизация является выдающимся кандидатом. –

+0

Предполагается выбрать один из многих и выбрать другой. Оптимизация отключена. – MrWayne

ответ

0

Если вы не работаете в Windows, тогда подумайте об использовании Valgrind - these are the supported platforms. Инструмент Memcheck запускает вашу программу (медленнее), просматривая каждую ссылку на память, чтобы отслеживать использование неинициализированных переменных.

Memcheck может обнаружить, если вашей программу:

  • Обращается памятью она не должна (область не выделена, районы, которые были освобождены, область в конце прошлых куч блоков, недоступные области стеки).
  • Использует неинициализированные значения опасными способами.
  • Утечки памяти.
  • Плохое освобождение блоков кучи (двойное освобождение, несоответствие освобождает).
  • Пропускает перекрывающиеся блоки источника и назначения памяти memcpy() и связанные с ними функции.
+0

К сожалению, я использую Windows, и я уже немного поработал с инструментами проверки памяти - они действительно показали некоторые проблемы, но это было очень вероятно вызвано большим количеством перераспределений, которые происходят в программе. – MrWayne

Смежные вопросы