The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Отладка систем телефонии на базе Asterisk
Статья предназначена для инженеров и разработчиков, стремящихся выйти
за рамки базовой конфигурации Asterisk и системно освоить методики
диагностики и отладки ядра и динамически подгружаемых модулей данной АТС.

В качестве инструментальной базы будет рассмотрено развёртывание изолированной
тестовой среды средствами VirtualBox для обеспечения контролируемых условий
анализа, а также использование отладчика GDB в связке с редактором Visual
Studio Code для пошагового выполнения кода, исследования структур данных и
осмысленного анализа работы компонентов системы в динамике.

Подразумеваю, что читатель имеет опыт установки ОС Linux в виртуальной среде и
знания в области локальных сетей, протоколов и языков программирования. Многие
очевидные моменты будут затронуты частично для экономии времени и объёма статьи.

Используемые инструменты:

  • VirtualBox >7.0
  • Установочный образ ОС Linux (дистрибутив не важен, но далее подразумевается Ubuntu Server 24.04)
  • Visual Studio Code с плагинами: Remote Explorer Подготовка: Необходимо установить ОС в виртуальную среду с обязательным выходом в интернет и доступом из-вне к самой машине. Для этого в настройках ВМ, до установки ОС:
  • Сеть - Адаптер 1 - Тип подключения Nat
  • Сеть - Адаптер 1 - Дополнительно - Проброс портов - Добавить правило
  • Протокол: TCP - Порт хоста: 2022 - Порт гостя: 22 При инсталляции ОС установить сервер SSH. Подробнее про установку ОС Linux см. в документации к своему дистрибутиву. Установив ОС на ВМ нужно убедится в доступности машины по SSH: ssh user@localhost -p 2022 В случае успеха настраиваем плагин Remote Explorer. Добавляем подключение по SSH и редактируем файл конфигурации для подключения к ВМ (cм. скриншот): Host localhost HostName 127.0.0.1 User username Port 2022 В окне соединений плагина Remote Explorer на строке соединения нажимаем Connect in current Window. Вводим пароль в окне поиска, когда система его запросит. В случае успеха откроется новое окно VS Code с индикатором подключения в правом нижнем углу (>{SSH: localhost). Если панель с командной строкой не открыта нажимаем Ctrl+J и видим приглашение консоли. Установка Asterisk в отладочном режиме с минимальной конфигурацией. В консоли нужно убедится, что Интернет доступен из ВМ: ping 1.1.1.1 Качаем свежую версию исходного кода Asterisk с сайта компании. wget https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-22-current.tar.gz tar -x -zf asterisk-22-current.tar.gz cd asterisk-22 Устанавливаем зависимости для компиляции системы из исходного кода и отладчик: sudo ./contrib/scripts/install_prereq install sudo apt install gdb Запускаем скрипты конфигурирования проекта в отладочном режиме. Выключаем все модули. ./configure --enable-dev-mode make menuselect.makeopts menuselect/menuselect --disable-all --enable pbx_config menuselect.makedeps Запускаем процесс компиляции с отладочными символами. make sudo make install После компиляции стартуем процесс Asterisk и консоль для проверки корректности запуска echo -e "[modules]\\nautoload = yes" | sudo tee -a /etc/asterisk/modules.conf sudo cp configs/basic-pbx/extensions.conf /etc/asterisk/ asterisk -f После запуска видим предупреждения о том, что не найдены конфигурационные файлы и строчка Asterisk Ready, что говорит о том, что можно приступать к отладке. Отладка Asterisk: В окне VS Code, подключенному к ВМ, устанавливаем плагин C/C++ и C/C++ Extension Pack. Открываем VS Code Explorer (Ctrl+Shift+E) и жмем Open Folder. В меню поиска выбираем каталог с Asterisk и нажимаем Ok. Открывается новое окно с деревом исходного кода Asterisk. В меню VS Code выбираем пункт Run - Add Configuration - CMake Debug и в открывшемся файле .vscode/launch.json удаляем все и добавляем 2 новых конфигурации: { "version": "0.2.0", "configurations": [ { "name": "Debug Asterisk (Local Launch)", "type": "cppdbg", "request": "launch", "program": "/usr/sbin/asterisk", "args": ["-f", "-vvvgc"], // Консольный режим с максимальным логгированием "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", "setupCommands": [ { "description": "Enable pretty-printing", "text": "-enable-pretty-printing", "ignoreFailures": true } ] }, { "name": "Debug Asterisk (Local Attach)", "type": "cppdbg", "request": "attach", "program": "/usr/sbin/asterisk", "processId": "${command:pickProcess}", "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", "miDebuggerArgs": "--interpreter=mi", "setupCommands": [ { "description": "Enable pretty-printing", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "Set debug mode", "text": "handle SIG33 pass nostop noprint" } ], } ] } Это конфигурации с локальным запуском и с присоединением к уже запущенному процессу. Сохраняем .vscode/launch.json (Ctrl+s). В окне дерева каталогов Asterisk в VS Code Explorer (Ctrl+Shift+E) открываем файл main/asterisk.c Мотаем на строчку 3613 и видим там функцию int main(int argc, char *argv[]). Устанавливаем точку остановки, нажав на красный кружок левее от номера строки (появится при наведении указателя мыши). Запускаем процесс отладки нажав на клавиатуре F5 или через меню Run - Debug. Процесс должен остановиться на точке входа и далее контролируем исполнение Выполнить строку без захода внутрь функции F10 Выполнить строку с заходом внутрь функции F11 В меню слева выбираем окно Run and Debug (Ctrl+Shift+D), видим локальные переменные, текущие потоки и точки останова. Отладка чтения файла конфигурации PBX extensions.conf: Ранее мы скомпилировали необходимый модуль pbx_config.so и он должен быть в /usr/lib/asterisk/modules/ ls /usr/lib/asterisk/modules/ Так же в /etc/asterisk/modules.conf должна находится следующая конфигурация: [modules] autoload = yes Открываем файл pbx/pbx_config.c на строке 2151 и ставим breakpoint на функции static int load_module(void) Запускаем отладку. Если остановились на раннее установленной токе в main() то просто нажимаем F5 и ждём останова в pbx/pbx_config.c:2151 Далее, построчно исполняем программу с помощью F10 - F11 и смотрим, что происходит с внутренним состоянием процесса. Заключение. Далее, можно докомпилировать интересующие модули из того же дерева каталогов через: make menuselect make sudo make install Можете посмореть в сторону проекта asterisk/testsuite с наборами тестов для модулей Asterisk и другие материалы
  • Скриншоты к статье
  • Скрипт для установки зависимостей Запускать от root
  • launch.json
  •  
    05.09.2025 , Автор: KoD , Источник: https://github.com/sysadminlab/aste...
    Ключи: asterisk, voip, debug
    Раздел:    Корень / Маршрутизаторы Cisco, VoIP / Ограничение и учет трафика на Cisco

    Обсуждение [ RSS ]
  • 1, KoD_ (?), 09:43, 06/09/2025 [ответить]  
  • +/
    Благодарю админов opennet за публикацию материала!
     
  • 2, амоним (?), 13:53, 06/09/2025 [ответить]  
  • +/
    оо оказывается можно просто порт пробросить для подключения с хоста, а я всегда для этого ставил несколько (виртуальных) сетевых адаптеров (одапрер1 - нат, адаптер2 - виртуальный адаптер хоста)
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру