The OpenNET Project / Index page

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



"Раздел полезных советов: Отладка систем телефонии на базе Asterisk"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Отладка систем телефонии на базе Asterisk"  +/
Сообщение от auto_tips (?), 06-Сен-25, 09:43 
Статья предназначена для инженеров и разработчиков, стремящихся выйти
за рамки базовой конфигурации 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

[[IMG /opennews/pics_base/CFD0C5CECEC5D4_1757133643.png]]

В окне соединений плагина 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/asteri...
   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.

[[IMG /opennews/pics_base/CFD0C5CECEC5D4_1757133785.png]]
[[IMG /opennews/pics_base/CFD0C5CECEC5D4_1757133817.png]]

В меню 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[]).

Устанавливаем точку остановки, нажав на красный кружок левее от номера строки (появится при наведении указателя мыши).

[[IMG /opennews/pics_base/CFD0C5CECEC5D4_1757134099.png]]

Запускаем процесс отладки нажав на клавиатуре F5 или через меню Run - Debug.

Процесс должен остановиться на точке входа и далее контролируем исполнение

  Выполнить строку без захода внутрь функции F10
  Выполнить строку с заходом внутрь функции F11

[[IMG /opennews/pics_base/CFD0C5CECEC5D4_1757134129.png]]

В меню слева выбираем окно 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

Можете посмореть в сторону проекта [[https://github.com/asterisk/testsuite asterisk/testsuite]] с наборами тестов для модулей Asterisk и другие материалы

*** [[https://github.com/sysadminlab/asterisk-remote-debug/tree/ma... Скриншоты к статье]]
*** [[https://github.com/sysadminlab/asterisk-remote-debug/blob/ma... Скрипт для установки зависимостей]] Запускать от root
*** [[https://github.com/sysadminlab/asterisk-remote-debug/blob/ma... launch.json]]

URL: https://github.com/sysadminlab/asterisk-remote-debug/blob/ma...
Обсуждается: http://www.opennet.me/tips/info/3274.shtml

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Отладка систем телефонии на базе Asterisk"  +/
Сообщение от KoD_ (?), 06-Сен-25, 09:43 
Благодарю админов opennet за публикацию материала!
Ответить | Правка | Наверх | Cообщить модератору

2. "Отладка систем телефонии на базе Asterisk"  +/
Сообщение от амоним (?), 06-Сен-25, 13:53 
оо оказывается можно просто порт пробросить для подключения с хоста, а я всегда для этого ставил несколько (виртуальных) сетевых адаптеров (одапрер1 - нат, адаптер2 - виртуальный адаптер хоста)
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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