Отладка систем телефонии на базе 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
|
|
|
|
Раздел: Корень / Маршрутизаторы Cisco, VoIP / Ограничение и учет трафика на Cisco |