Руководство по локализации сбоев и подготовке отчётов о них
Введение
Отладке и тестированию системы OpenSCADA уделяется значительное время разработчиков, однако в виду ограниченности ресурсов да и практической невозможности охватить все варианты конфигурации и исполнения системы OpenSCADA ошибки могут проявляться как в виде невыполнения отдельных функций, некорректности их выполнения и даже аварийного завершения программы у пользователей. Понимание этого со стороны пользователя очень важно, и с его стороны требуется добрая воля для затраты некоторого времени на подготовку отчёта о проблеме с целью её последующего устранения разработчиками.
Перед подготовкой уведомления о проблеме рекомендуется ознакомится с перечнем ошибок и замечаний в соответствующем разделе
Ошибки и замечания к системе OpenSCADA.
Требования к уведомлению об ошибке
Для исключения лишних наводящих вопросов и для ускорения процесса локализации проблемы рекомендуется следовать следующим требованиям к уведомлению.
- Указывать окружение исполнения OpenSCADA, а именно дистрибутив и версию операционной системы.
- Указывать версию системы OpenSCADA, включая SVN-ревизию для рабочих версий.
- Указывать особенности конфигурации и исполнения. Желательно добиваться проявления проблемы в стандартных конфигурациях и на демонстрационной БД. Если этого не удаётся достичь, то необходимо описать особенности конфигурации и приложить к уведомлению БД, на которой проблема проявляется.
- Описать действия вызывающие ошибку.
- Приложить протокол сообщений OpenSCADA для сеанса с проявлением ошибки.
- В случае аварийного завершения необходимо сформировать файл предсмертного дампа памяти программы и получить из него разворот стека исполнения на момент аварии, о чём ниже. При проблемах, связанных с зависанием одной или нескольких задач OpenSCADA, для локализации может быть полезно ручное прерывание программы сигналом "SIGSEGV", что вызовет формирование предсмертного дампа с информацией о месте зависания.
- Для значительного увеличения пользы разворота стека вы должны добавить отладочную информацию, установкой опции "-g" во время компиляции или установкой готовых отладочных пакетов.
Способы уведомления
Уведомить об ошибке в системе OpenSCADA можно несколькими способами:
Получение файла предсмертного дампа и его обработка
В ОС Linux, при сбое программ, ядро ОС может формировать предсмертный дамп памяти программы. С помощью этого дампа часто можно выявить место в программе, вызвавшее аварийную остановку. Для включения возможности генерации предсмертного дампа памяти программы ядром необходимо выполнить команды:
# Проверка возможности генерации дампов памяти
# Указывает "core", если включена
$ cat /proc/sys/kernel/core_pattern
# Включение генерации дампов памяти
$ echo "core" > /proc/sys/kernel/core_pattern
После этого необходимо снять ограничение на размер генерируемого файла дампа, для чего OpenSCADA можно запустить с аргументом
--CoreDumpAllow или выполнить специальную команду перед вызовом OpenSCADA "
$ ulimit -c unlimited".
Затем достаточно убедиться в том, что пользователь, запускающий OpenSCADA, имеет право записи в рабочую директорию OpenSCADA, параметр "
Workdir" в конфигурационном файле программы.
Далее запускается система OpenSCADA и воспроизводится аварийное завершение, в результате которого в рабочей директории OpenSCADA создаётся файл
core.
Типовые скрипты запуска OpenSCADA, которые поставляются в пакетах дистрибутивов OpenSCADA с версии 0.8.0, включают генерацию дампа памяти и автоматически формируют из него отчёт обратных вызовов (backtrace) в виде файлов "AGLKS_core_2016-03-20_18.17.crash" (для 0.9 Work) или "crash_2012-01-05_11:05.txt" (для 0.8 LTS) в рабочей директории проекта.
Если сформировался файл дампа памяти
core, а отчёт обратных вызовов автоматически не сформировался, то вероятно не установлен отладчик "gdb". В таком случае Вы должны его установить и вызвать вручную команду, из рабочей директории для глобальной конфигурации:
$ gdb openscada --core core --batch --quiet -ex "thread apply all bt full" -ex "quit" > crash_$(date +%F_%H:%M).txt
Или-же выполнить процедуру в интерактивном режиме, для глобальной конфигурации:
# Переход к рабочей директории OpenSCADA
(gdb) cd /var/spool/openscada
# Указание исполняемого файла, не скрипты!
(gdb) file /usr/bin/openscada
# Указание файла дампа памяти программы
(gdb) core-file /var/spool/openscada/core.26658
# Получение разворота стека исполнения
(gdb) thread apply all bt full
#0 0xb7d104c0 in pthread_cancel () from /lib/librt.so.1
#1 0xb7d1edaa in start_thread () from /lib/libpthread.so.0
#2 0xb7dfcf5e in clone () from /lib/libc.so.6