Во-первых, вам повезло, что ваш процесс аварийно завершился несколько раз за короткий промежуток времени.Это должно облегчить выполнение.
Это то, как вы продолжаете.
- Получите аварийный дамп
- Изоляция набора потенциально подозрительных функций
- Подтвердите проверку состояния
- Повторите
Получите аварийный дамп
Сначала вам действительно нужно получить аварийный дамп.
Если вы не получаете аварийных дампов при сбоях, начните с написания теста, который производит надежные аварийные дампы.
Перекомпилируйте двоичный файл с отладочными символами или убедитесь, что вы можете проанализироватьаварийный дамп с символами отладки.
Поиск подозрительных функций
Учитывая, что у вас есть аварийный дамп, посмотрите на него в gdb или вашем любимом отладчике и не забудьте показать все потоки!Возможно, это не тот поток, который вы видите в gdb с ошибками.
Если посмотреть, где gdb сообщает, что ваш двоичный файл разбился, выделите некоторый набор функций, которые, по вашему мнению, могут вызвать проблему.
Просмотр несколькихсбой и изоляция фрагментов кода, которые обычно активны во всех сбоях, позволяют сэкономить время.
Проверка состояния с повышением
Сбой обычно происходит из-за некоторыхгосударство.Лучший способ продолжить это часто ужесточать государственные требования.Вы делаете это следующим образом.
Для каждой функции, которая, по вашему мнению, может вызвать проблему, запишите, какое юридическое состояние должно иметь вход или объект при входе в функцию.(Сделайте то же самое для того, какое юридическое состояние оно должно иметь при выходе из функции, но это не так уж важно).
Если функция содержит цикл, задокументируйте юридическое состояние, которое она должна иметь в начале каждогоповторение цикла.
Добавьте утверждения для всех таких выражений допустимого состояния.
Повторите
Затем повторите процесс.Если он все еще выходит за пределы ваших утверждений, затяните утверждения еще больше.В какой-то момент процесс завершится аварийно, а не из-за случайного сбоя.На этом этапе вы можете сосредоточиться на попытке выяснить, что заставило вашу программу перейти из допустимого состояния при входе в функцию, в недопустимое состояние в точке, где произошло утверждение.
Если вы сопоставляете утверждения сподробное ведение журнала должно быть проще следить за тем, что делает программа.