Статья предназначена для инженеров и разработчиков, стремящихся выйти
за рамки базовой конфигурации 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
Благодарю админов opennet за публикацию материала!
оо оказывается можно просто порт пробросить для подключения с хоста, а я всегда для этого ставил несколько (виртуальных) сетевых адаптеров (одапрер1 - нат, адаптер2 - виртуальный адаптер хоста)