LINUX.ORG.RU

Как отлаживать event loop?

 


1

3

Пламенный куку!

Есть средних размеров проект с десятком плагинов, часть из которых ожидают всяких событий извне, часть — от других плагинов. Все живут на основном цикле обработке событий, созданы искусственные условия, когда источники внешних событий выключены, а значит никаких событий в системе не гоняется (по крайней мере теоретически, CPU usage 0). Создаю плагин, слушающий запросы из сети (QTcpSocket). В пустом проекте он откликается 2к раз в секунду (нам этого хватает с запасом, переписывать на более нормальную сетевую библиотеку не в приоритете). Теперь засовываем плагин в основной проект и имеем 40/сек, CPU usage 0.

Следующий эксперимент — в этом же проекте запускаем плагин в отдельном потоке со своим event-loop-ом, получаем те 2к/сек.

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

Код всего есть. Эксперименты с поочередным отключением плагинов затруднены из-за уж совсем черезжопной конфигурации всего этого. Сейчас я по всей видимости этим займусь, но хочется варианта отладки попроще, если не сейчас то на будущее. Посему вопрос, как «посмотреть», что происходит в основном цикле обработки событий программы (QCoreApplication)? В принципе достаточно чего-то вроде такого лога (с временем, конечно):

пока нет событий, жду новых
есть новые события!
начинаю обработку события Х
заканчиваю обработку события Х
начинаю обработку события Y
заканчиваю обработку события Y
пока нет событий, жду новых
★★★★★

Посему вопрос, как «посмотреть», что происходит в основном цикле обработки событий программы (QCoreApplication)?

Переопределить и printf туда впендюрить, правда производительность упадёт от этого. Но тебе ведь только ошибку найти...

UVV ★★★★★ ()
Ответ на: комментарий от staseg

Я делал у себя собственный exec, в который скопировал код и eventloop QApplication. Для этого надо от него унаследоваться.

g0t0 ()

Никак

Основная проблема это непонимание того, что сами события не нужно отлаживать. Отлаживать надо функции и процедуры, которые срабатывают при том или ином событии.

Чтобы научиться отлаживать такие функции необходимо просто рисовать, записывать карты всех возможных входных значений. Мусор на входе - мусор на выходе (с). Это правило еще никто не отменял.

gh0stwizard ★★★★★ ()
Ответ на: Никак от gh0stwizard

Читай внимательно пост, я понимаю, что «зависания» происходят в обработчиках. Отладкой цикла я хотел увидеть, какой из обработчиков тормозит. Код не мой, взять и сходу проанализировать все обработчики довольно сложно.

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

staseg ★★★★★ ()
Ответ на: комментарий от UVV

Нашел виртуальную функцию notify. ты имеешь в виду, переопределить ее? Если я правильно понял ее доку, это позволит распечатать моменты начала и окончания обработки события. Если я правильно ее понял. Поковыряю на досуге, спасибо.

staseg ★★★★★ ()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от staseg

А

virtual bool event ( QEvent * e )
void QObject::installEventFilter ( QObject * filterObj )
не нашёл? С последней можно и не наследоваться, просто в свой handler перенаправил все события и всё.

UVV ★★★★★ ()
Ответ на: комментарий от UVV

event, насколько я понимаю, переопределяется для обработки сообщения, которое передано твоему объекту (в данном случае объекту QCoreApplication), оно на сам event-loop повлиять никак не должно. А вот фильтр не видел, да. Создавал бы я топик, если сам во всем разобрался бы? :)

staseg ★★★★★ ()
Ответ на: комментарий от staseg

Создавал бы я топик, если сам во всем разобрался бы? :)

Ещё бы, в духе ЛОРа нужно убедить остальных, что ты прав %)

UVV ★★★★★ ()
Ответ на: комментарий от staseg

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

g0t0 ()

strace. Там если что все sleep, poll и т.п. будет видно

Olegymous ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.