Asterisk ended with exit status 139 (Segmentation fault): сбор и анализ Core Dump
- Asterisk внезапно падает и перезапускается safe_asterisk с ошибкой
Asterisk ended with exit status 139. - Все активные телефонные разговоры абонентов моментально обрываются.
- В системном журнале
dmesgрегистрируется:asterisk[PID]: segfault at ... ip ... sp ... error 4 in .... - Падение происходит при обработке нестандартных SIP пакетов, смене кодеков или под высокой нагрузкой.
1. Включение генерации Core Dumps в safe_asterisk и systemd
Отредактируйте /etc/asterisk/asterisk.conf:
[options]
dumpcore = yesВ юните systemd /etc/systemd/system/asterisk.service.d/override.conf снимите лимиты:
[Service]
LimitCORE=infinity
WorkingDirectory=/tmpsystemctl daemon-reload && systemctl restart asterisk2. Проверка и поиск сформированного Core Dump
coredumpctl list asterisk
coredumpctl info $(pgrep asterisk || echo "")3. Анализ стека вызовов через GDB и скрипт ast_debug_tools
Установите утилиты отладки и debuginfo пакеты Asterisk:
apt-get install -y gdb asterisk-dbg || dnf debuginfo-install -y asteriskЗапустите интерактивную отладку упавшего процесса:
coredumpctl debug asterisk
# Внутри интерфейса GDB выполните:
(gdb) set logging on
(gdb) thread apply all bt full
(gdb) quit4. Автоматическая генерация полного отчета об ошибке
Используйте штатный скрипт Asterisk для формирования баг-репорта:
/usr/src/asterisk/contrib/scripts/ast_debug_tools.sh --dumplist
/usr/src/asterisk/contrib/scripts/ast_debug_tools.sh --core=/tmp/core.asterisk.* --output=/tmp/backtrace.txt Частые вопросы (FAQ)
Что означает статус завершения 139?
Код 139 означает, что процесс был принудительно завершен ядром Linux по сигналу SIGSEGV (сигнал 11: 128 + 11 = 139) из-за попытки чтения или записи по недопустимому адресу оперативной памяти (Null Pointer Dereference, Use-After-Free).
Как предотвратить падения из-за битых пакетов RTP/SIP?
Обновите Asterisk до актуального LTS-релиза (18.x / 20.x), перейдите с устаревшего chan_sip на res_pjsip и отключите неиспользуемые экспериментальные кодеки в codecs.conf.
Где сохраняются дампы памяти, если coredumpctl не установлен?
Файлы сохраняются в рабочий каталог процесса (обычно /tmp/core* или /var/spool/asterisk/core*) в соответствии с системным шаблоном /proc/sys/kernel/core_pattern.
Как запустить Asterisk под Valgrind для поиска утечек и битой памяти?
Запустите бинарник вручную: valgrind --leak-check=full --log-file=/tmp/valgrind.log /usr/sbin/asterisk -f -vvvg.