Сообщение об ошибках

Чтобы начать разбираться с проблемой, необходимо наличие файла трассировки, выполненной с уровнем 6 (за исключением случаев когда проблема легко воспроизводится по описанным действиям). Кроме трассировки, по возможности, к сообщению об ошибке можно также приложить Backtrace.

Трассировка

Общая информация

Трассировка - постоянная запись в файл информации о том, что происходит «внутри» OpenMCU-ru во время работы конференции. Трассировка почти наверняка понадобится для того, чтобы попытаться понять, почему у вас что-то случилось со звуком или с видео, почему OpenMCU-ru вдруг завис, самопроизвольно прекратил работу или случилось что-то ещё, с чем придётся разбираться.

Трассировка осуществляется с заданным уровнем трассировки: от 0 (выключена) до 6 (максимально подробная). Уровень трассировки настраивается в вебинтерфейсе на странице настроек сервера.

Файл трассировки может быть очень большим, если OpenMCU-ru работал длительное время. Для того, чтобы получить файл оптимального размера, желательно:

  • перезапустить демон OpenMCU-ru;
  • по возможности сразу спровоцировать проблему;
  • остановить демон;
  • скопировать файл (при следующем запуске существующая трассировка будет затёрта вновь созданной).

Прежде чем вкладывать трассировку в сообщение форума, её желательно заархивировать.

Файл трассировки с уровнем 6, как правило, содержит информацию о типе оборудования, именах пользователей и IP-адресах, использованных в ходе сеанса видеоконференцсвязи. Высылая кому-либо файл с трассировкой или публикуя его где-либо (например, выкладывая на форуме), вы даёте согласие на обработку этих сведений. Как правило, это не очень страшный секрет, тем не менее, нужно, чтобы вы это понимали.

Месторасположение файла трассировки зависит от операционной системы:

  • под Linux это папка /var/log/openmcu-ru/
  • под Windows это папка C:\Program Files\OpenMCU-ru\log
  • под FreeBSD это папка /usr/local/share/openmcu-ru/log/

Если используется нестандартная сборка - трассировка теоретически может располагаться в любом другом месте, либо быть отключена совсем.

Если в настройках включена ротация трассировок, то предыдущую трассировку можно скачать через вебинтерфейс:

http://openmcu:1420/trace0.txt

Примеры трассировки

Трассировка только на первый взгляд кажется сложной. Вы вполне можете начать изучать её самостоятельно, и узнаете много нового и увлекательного об H.323 и SIP.

В первом столбце пишется время с момента запуска OpenMCU-ru в формате (ЧАСЫ:)МИНУТЫ:СЕКУНДЫ.миллисекунды. Во втором столбце (и иногда в третьем) - источник события. Далее - само событие. Форма протоколирования не очень строгая, особенно на уровне 6, где пишется много различных дампов - в этом случае отметка времени и источник события будут присутствовать только в первой строке распечатки дампа.

В самом начале трассировки (в момент запуска) вы увидите много таких записей:

  0:00.042	  OpenMCU.ru	H323	Added capability: SILK_B40{sw} <1>

Это информация о кодеках, которые может использовать OpenMCU-ru. Если не хватает нужного кодека в списке - может быть, вы забыли его подключить.

Второй столбец может содержать после двоеточия идентификатор вычислительного потока, например:

H225 Answe...er:8120d40

Это упрощает отладку, так как, скорее всего, проблема происходит только в одном потоке, в то время как все остальные работают как положено. Поток по-английски - thread, для перевода на русский язык остальных слов может пригодиться англо-русский словарь.

Несколько примеров того, что должно присутствовать в «хорошей» трассировке (если OpenMCU-ru установлен и работает правильно):

Открывается порт TCP 1720 для приёма входящих вызовов:

  0:00.041        OpenMCU.ru    PWLib   Created thread 0x8120328 H323 Listener:%0x
  0:00.041        OpenMCU.ru    PWLib   File handle high water mark set: 17 PTCPSocket
  0:00.041        OpenMCU.ru    H323    Started listener Listener[ip$*:1720]
  0:00.042        OpenMCU.ru    PWLib   Thread high water mark set: 6
  0:00.042      H323 Liste...er:8120328 PWLib   Started thread 0x8120328 H323 Listener:8120328
  0:00.042      H323 Liste...er:8120328 H323    Awaiting TCP connections on port 1720
  0:00.042      H323 Liste...er:8120328 TCP     Waiting on socket accept on ip$*:1720

Время и идентификаторы потоков у вас будут другими, но всё остальное должно быть приблизительно похоже.

Запускается веб-сервер (с помощью которого вы управляете конференцией через браузер) на основе библиотеки ptlib:

  0:00.054	  OpenMCU.ru	PWLib	Created thread 0x8121300 HTTP Service:%x
  0:00.054	  OpenMCU.ru	PWLib	Thread high water mark set: 7
  0:00.054	HTTP Servi...ce:8121300	PWLib	Started thread 0x8121300 HTTP Service:8121300

Создаётся конференция room101:

  0:00.055	  OpenMCU.ru	PColCnv	PColourConverter constructed: YUV420P 1408x1152 -> YUV420P 352x288
  0:00.055	  OpenMCU.ru	Conference	New conference started: ID=ec8e232a-68eb-e111-9471-001a64cafed8, number = room101
  0:00.055	  OpenMCU.ru	PColCnv	PColourConverter constructed: YUV420P 704x576 -> YUV420P 352x288
  0:00.056	  OpenMCU.ru	Conference	About to add member  to conference ec8e232a-68eb-e111-9471-001a64cafed8
  0:00.056	  OpenMCU.ru	Conference	Adding member 135404784 to conference ec8e232a-68eb-e111-9471-001a64cafed8
  0:00.056	  OpenMCU.ru	PWLib	File handle high water mark set: 22 Thread unblock pipe
  0:00.056	  OpenMCU.ru	PWLib	Created thread 0x8122710 
  0:00.056	  OpenMCU.ru	PWLib	Thread high water mark set: 8
  0:00.056	  OpenMCU.ru	PWLib	File handle high water mark set: 24 Thread unblock pipe
  0:00.056	  OpenMCU.ru	PWLib	Created thread 0x8122ad8 
  0:00.056	PSimpleThr...d:08122710	PWLib	Started thread 0x8122710 PSimpleThread:08122710
  0:00.056	  OpenMCU.ru	PWLib	Thread high water mark set: 9
  0:00.056	PSimpleThr...d:08122ad8	PWLib	Started thread 0x8122ad8 PSimpleThread:08122ad8

Backtrace

Общая информация

Backtrace (так же называют «stack trace») - это список вызванных приложением функций во время сбоя приложения. Этот список может быть полезен при разрешении проблемы. Так как позволяет разработчикам узнать в какой функции произошёл сбой.

В первую очередь должен быть установлен GNU Debugger. В Debian/Ubuntu это можно сделать следующим образом:

apt-get install gdb

для CentOS/Fedora:

yum install gdb

Чтобы сделать backtrace есть два способа:

Способ 1 - «вручную».

  • Запустить приложение в отладчике (gdb).
  • Дождаться краха приложения (или сгенерировать его, если известна последовательность действий приводящая к краху).
  • Выполнить необходимые команды в отладчике для вывода backtrace.

У этого способа есть свои преимущества, но есть и несколько недостатков. В частности, если приложение падает редко и по непонятным причинам, то дожидаться его завершения в отладчике - не самый удобный вариант.

Способ 2 - «запись дампа памяти» (coredump).

  • Включить сохранение дампов памяти для приложения.
  • Запустить приложение и работать с ним как обычно.
  • В случае падения приложения - будет автоматически создан дамп памяти.
  • После того как приложение аварийно завершилось, его можно (автоматически) перезапустить и продолжить работу - созданный дамп от этого не пострадает.
  • Полученные дампы памяти можно также проанализировать с помощью gdb и получить backtrace.

Второй способ рассмотрим подробнее.

Включение записи дампов

1. Сначала нужно указать операционной системе куда сохранять coredump:

mkdir /var/cores
chmod 777 /var/cores
echo "kernel.core_pattern=/var/cores/core.%e.%t.%p.%s" >> /etc/sysctl.conf
sysctl kernel.core_pattern=/var/cores/core.%e.%t.%p.%s

В указанном примере дампы будут сохраняться в /var/cores в формате:

core.$EXECUTABLE_FILENAME.$UNIX_TIME.$PID.$SIGNAL_NUMBER

Например:

/var/cores/core.openmcu-ru.1381844450.32503.3

2. Необходимо разрешить создание дампов непосредственно для службы OpenMCU-ru. Для этого, в файле /etc/default/openmcu-ru раскоментируйте строчку:

DAEMON_COREDUMP="unlimited"

И перезапустите службу.

3. По необходимости установить отладочные символы для OpenMCU-ru. В некоторых дистрибутивах отладочные символы находятся в отдельных пакетах. Например для Ubuntu необходимо выполнить:

apt-get install openmcu-ru-dbg

На этом подготовительный этап закончен. Теперь осталось дождаться аварийного завершения OpenMCU-ru. Для проверки того, что всё сделано правильно, можно вручную уронить приложение (лучше не делать во время видеоконференции директора):

killall -SIGSEGV openmcu-ru

В результате этой команды служба должна завершиться, а в папке /var/cores/ должен появиться отладочный дамп.

4. Для получения backtrace по дампу памяти нужно выполнить следующую команду:

gdb -batch \
  -ex 'set pagination 0' \
  -ex 'echo \n' \
  -ex 'backtrace' \
  -ex 'echo \n' \
  -ex 'info registers' \
  -ex 'echo \n' \
  -ex 'x/16i $pc' \
  -ex 'echo \n' \
  -ex 'thread apply all backtrace' \
  -ex 'quit' \
  /usr/bin/openmcu-ru \
  /var/cores/core.openmcu-ru.1381844450.32503.3 \
  > openmcu-ru_backtrace.log

Вместо указанного в примере coredump нужно подставить свой. Если исполняемый файл openmcu-ru находится по другому пути (например /opt/openmcu-ru/bin/openmcu-ru) - тоже исправить на нужный.

В результате выполнения этой команды будет создан файл openmcu-ru_backtrace.log (в текущем каталоге), который нужно заархивировать и выкладывать в своей теме вместе с описанием ошибки.

См. также