Непонятные ошибки времени выполнения - общий подход? - PullRequest
7 голосов
/ 01 марта 2011

Я столкнулся с проблемой, которая настолько загадочна, что я даже не знаю, как сформулировать этот вопрос ... Я даже не могу опубликовать какой-либо фрагмент кода.

Я сам разрабатываю большой проект, начатый с нуля. Уже почти время релиза, но я не могу избавиться от досадной ошибки. Моя программа время от времени записывает выходной файл, и во время этого я получаю либо:

  • std :: string out_of_range error
  • std :: string length_error
  • просто много глупостей на выходе

Стоит отметить, что эти ошибки появляются очень редко и могут никогда не воспроизводиться , даже с одним и тем же вводом. Memcheck не показывает нарушения памяти, даже в тех случаях, когда ошибки были отмечены ранее. Cppcheck также не жалуется. Я интенсивно использую STL и pthreads, но без последнего также случаются ошибки.

Я пробовал как новейшие g ++, так и icpc. Я работаю на какой-то версии Ubuntu, но я не верю, что в этом причина.

Я был бы признателен за любую помощь от вас, ребята, как решить такие проблемы. Заранее спасибо.

Ответы [ 6 ]

2 голосов
/ 01 марта 2011

Симптомы намекают на повреждение памяти.

Если бы мне пришлось угадывать, я бы сказал, что что-то портит внутреннее состояние объекта std::string, который вы записываете.Живет ли строковый объект в стеке?Исключили ли вы разрушение стека в качестве возможной причины (которая не может быть обнаружена valgrind)?

Я бы также предложил запустить ваш исполняемый файл под отладчиком, настроенным таким образом, чтобы он вызывалточка останова всякий раз, когда возникает проблема.Это позволит вам изучить состояние вашего процесса на этом этапе, что может помочь выяснить, что происходит.

2 голосов
/ 01 марта 2011

Включить coredumps (ulimit -c или setrlimit ()), получить ядро ​​и запустить gdb'ing. Или, если можете, выполните настройку, в которой вы всегда будете работать под GDB, чтобы в случае возникновения ошибки у вас была доступная информация.

1 голос
/ 01 марта 2011

Вы интенсивно используете STL, поэтому вы можете попробовать запустить вашу программу с libstdc ++ в режиме отладки .Он будет делать дополнительные проверки итераторов, контейнеров и алгоритмов.Чтобы использовать режим отладки libstdc ++, скомпилируйте ваше приложение с флагом компилятора -D_GLIBCXX_DEBUG

1 голос
/ 01 марта 2011

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

1 голос
/ 01 марта 2011

Я столкнулся со странными ошибками оптимизации в gcc (например, при сборке ++i в i++ в редких случаях).Вы можете попробовать объявить некоторые критические переменные volatile, но если valgrind ничего не найдет, шансы невелики.И, конечно, это похоже на стрельбу в темноте ...

Если вы, по крайней мере, можете обнаружить, что что-то не так во время определенного запуска изнутри программы, например, обнаружение бессмысленного вывода, вы можете затем вызвать пустое значение "gotNonsense() "функция, в которую вы можете break использовать gdb.

1 голос
/ 01 марта 2011

gdb и valgrind - очень полезные инструменты для устранения ошибок, подобных этой. valgrind особенно эффективен для выявления проблем с доступом к памяти и утечек памяти.

...