Решение случайных сбоев - PullRequest
       58

Решение случайных сбоев

34 голосов
/ 09 августа 2010

Я получаю случайные сбои в моем приложении C ++, оно может не падать в течение месяца, а затем аварийно завершать работу 10 раз в час, а иногда может произойти сбой при запуске, а иногда может произойти сбой после нескольких часов работы (иливообще не вылетает).

Я использую GCC в GNU / Linux и MingW в Windows, поэтому я не могу использовать отладку JIT в Visual Studio ...

Понятия не имеючтобы продолжить, поиск случайного кода не сработал, код ОГРОМНЫЙ (и хорошая часть не была моей работой, у него также есть много полезных вещей), и я также не имею понятия о том, каквоспроизведите сбой.

РЕДАКТИРОВАТЬ: Многие люди упоминали, что ... как я делаю дамп ядра, мини-дамп или что-то еще?Это первый раз, когда мне нужна посмертная отладка.

EDIT2: На самом деле DrMingw перехватил стек вызовов, без информации о памяти ... К сожалению, стек вызовов мне не очень помог, потому что в конце внезапно онзайдите в какую-нибудь библиотеку (или что-то), что у меня нет отладочной информации, в результате чего получаются только некоторые шестнадцатеричные числа ... Поэтому мне все еще нужен приличный дамп, который дает больше информации (особенно о том, что было в памяти ... в частности,что было в месте, которое выдало ошибку «нарушение прав доступа»)

Кроме того, мое приложение использует Lua и Luabind, возможно, ошибка вызвана скриптом .lua, но я понятия не имею, как отлаживатьчто.

Ответы [ 17 ]

3 голосов
/ 09 августа 2010

Первое, что я хотел бы сделать, это отладить дамп ядра с помощью gdb (как для Windows, так и для Linux). Второй будет запускать такую ​​программу, как Lint, Prefast (Windows), Clang Analyzer или какую-либо другую программу статического анализа (будьте готовы к множеству ложных срабатываний). В-третьих, это какая-то проверка во время выполнения, например, Valgrind (или его закрытые варианты), Microsoft Application Verifier или Google Perftools .

И регистрация. Который не должен идти на диск. Вы можете, например, войти в глобальный std::list<std::string>, который будет сокращен до последних 100 записей. При обнаружении исключения отобразите содержимое этого списка.

3 голосов
/ 09 августа 2010

Звучит как что-то хитрое, вроде состояния гонки.

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

В следующий раз, когда программа выйдет из строя, вы можете запустить gdb на coredump и посмотреть, в чем проблема. Вероятно, это будет последовательная ошибка, но это должно помочь вам начать.

2 голосов
/ 27 августа 2015

Здесь есть много хороших ответов, но никто еще не коснулся угла Lua.

Обычно Lua ведет себя довольно хорошо, но он все еще может вызвать повреждение или сбой памяти, еслинапример, переполнение или недополнение стека Lua, или выполняется неверный байт-код.

Одна простая вещь, которую вы можете сделать, чтобы обнаружить много таких ошибок, - определить макрос lua_assert в luaconf.h.Определение этого (например, для стандартного утверждения C) позволит включить различные проверки работоспособности внутри ядра Lua.

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

Еще одна базовая проверка: убедитесь, что вы полностью перестроили вашего проекта.Если вы настраивали различные файлы (особенно файлы заголовков) и выполняли частичные сборки, то все может стать беспорядочным, если ваши зависимости сборки не идеальны.Полная перестройка просто устраняет эту возможность.

Также для Windows ознакомьтесь с инструментами отладки Microsoft для Windows и особенно их gflags .

1 голос
/ 09 августа 2010

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

0 голосов
/ 09 августа 2010

Если ваше приложение не специфично для Windows, вы можете попробовать скомпилировать и запустить вашу программу на других платформах, таких как Linux (другой дистрибутив, 32/64 бита, ... если вы любите роскошь). Это может помочь вызвать ошибки вашей программы. Конечно, вы должны использовать инструменты, упомянутые в других статьях, такие как gdb, valgrind и т. Д.

0 голосов
/ 09 августа 2010

Еще два указателя / идеи (помимо дампа ядра и valgrind в Linux):

1) Попробуйте «Qt Creator» от Nokia.Он поддерживает mingw и может выступать в качестве посмертного отладчика.

2) Если это возможно, возможно, просто постоянно запускать приложение в gdb?

...