Ubuntu, wxEventHashTable:ReconstructAll и critical sections

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
madnut.ua
Knows some wx things
Knows some wx things
Posts: 31
Joined: Fri Dec 08, 2006 10:49 pm
Location: Ukraine
Contact:

Ubuntu, wxEventHashTable:ReconstructAll и critical sections

Post by madnut.ua » Thu Jul 30, 2009 11:13 pm

Может кто имел опыт работы под линухами, подскажите. Есть серьезная проблема, при попытке портировать аппликацию под Ubuntu, она намертво отказывается работать. Собирается нормально, запускается даже, но после этого тишина. В системном мониторе загрузка проца на 40-50% и больше никаких действий. Не доходит даже до точки входа аппликации.

1. Методом тыка было выяснено, что причина в подобном поведении кроется где-то в wxEventHashTable::ReconstructAll() (common/event.cpp) самой либы wx. Простое комментирование и немножко подправленный код проблему решил, но причину я так и не понял. Пробовал собирать примеры, все работают отлично. Почему именно данная прога зациклилась, не могу понять. Может быть у кого есть мысли на этот счет, поделитесь!

2. После решения первой проблемы возникла другая - вложенные критические секции. Насколько я понял из доки, вложенные критические секции в никсах не поддерживаются, поэтому wx использует mutexы для реализации поведения крит. секций.
Но моя прога использует вложенные вызовы wxCriticalSectionLocker с одной и той же переменной и в Ubuntu при возникновении такой ситуации прога просто напросто замирает. Процесс монитор показывает, что прога ждет освобождения мутекса, но оно никогда не наступает. Подскажите, как быть в такой ситуации?

Проверялось на разных версиях wxWidgets (2.8.10, 2.8.9) и на разных Ubuntu (8.04, 9.04)

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Thu Jul 30, 2009 11:30 pm

Собирается нормально, запускается даже, но после этого тишина.
Значит что-то ты не так делаешь (с)

Как собрана wxWidgets? Дай командную строку для ./configure ?

Ммм.. Дебажить пробовал? Докуда доходит? логгинг через wxLogTrace() в крайнем случае.

Вложенные критические секции.. мм, а что ты ими хосешь реализовать? Может есть более другое решение, попроще? На мьютексы не пробовал перейти?

madnut.ua
Knows some wx things
Knows some wx things
Posts: 31
Joined: Fri Dec 08, 2006 10:49 pm
Location: Ukraine
Contact:

Post by madnut.ua » Sat Aug 01, 2009 2:06 pm

T-Rex wrote:
Собирается нормально, запускается даже, но после этого тишина.
Значит что-то ты не так делаешь (с)
Это понятно, хотелось бы только понять что же все таки :)
T-Rex wrote: Как собрана wxWidgets? Дай командную строку для ./configure ?
См. в аттаче
T-Rex wrote: Ммм.. Дебажить пробовал? Докуда доходит? логгинг через wxLogTrace() в крайнем случае.
Дебажить не получается. Использую CodeBlocks, не доходит даже до точки входа. При попытке стопнуть он останавливается как раз на wxEventHashTable::ReconstructAll()
А как включить wxLogTrace, не нашел. Вроде и дефайн ставил, а все равно в логе нет таких сообщений
T-Rex wrote: Вложенные критические секции.. мм, а что ты ими хосешь реализовать? Может есть более другое решение, попроще? На мьютексы не пробовал перейти?
С помощью секций сделана синхронизация некоторых методов. И как раз часто возникают ситуации, когда метод вызвается еще раз будучи уже залоканым выше, что приводит к бесконечному ожиданию.
А мьютексы, как именно заюзать? Хотя по сути в линуксе wxCriticalSection использует те же мьютексы.
Attachments
configure.7z
(23.82 KiB) Downloaded 111 times

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Sat Aug 01, 2009 2:20 pm

Как себя ведет приложение если wx собрать с ./configure без параметров?
Как себя ведет приложение если из проекта исключить все формы и в OnInit() создавать просто wxFrame?
В приложении если статические/глобальные переменные, не относящиеся к стандартными типам C++?
Есть ли в приложении статические wxBitmap/wxImage или изображения, которые теоретически могут попытаться загрузиться до wxImage::AddHandler() ?
Как себя ведет приложение если wxLogDebug(wxT("test")) написать в конструкторе класса приложения?
Как себя ведет приложение если запускать из gdb/ddd вручную?
Как себя ведет приложение если вместо IMPLEMENT_APP() заюзать IMPLEMENT_APP_NO_MAIN и руками написать main() и инициализацию wx и запуск wxEntry ?

madnut.ua
Knows some wx things
Knows some wx things
Posts: 31
Joined: Fri Dec 08, 2006 10:49 pm
Location: Ukraine
Contact:

Post by madnut.ua » Sat Aug 01, 2009 3:59 pm

Как себя ведет приложение если wx собрать с ./configure без параметров?
Поставил готовый релиз 2.8.10 с помощью установщика пакетов из apt.wxwidgets.org - все без изменений
Как себя ведет приложение если из проекта исключить все формы и в OnInit() создавать просто wxFrame?
До OnInit вообще дело не доходит. См. ниже.
В приложении если статические/глобальные переменные, не относящиеся к стандартными типам C++?
Кроме стандартных типов С++ статически используются еще wxWidgets типы.
Есть ли в приложении статические wxBitmap/wxImage или изображения, которые теоретически могут попытаться загрузиться до wxImage::AddHandler() ?
Вроде бы нет
Как себя ведет приложение если wxLogDebug(wxT("test")) написать в конструкторе класса приложения?
Выводит сообщение в консоль. Дебаггер тоже на нем стопается, но после этого больше никуда не попадает. Получается, что конструктор он еще проходит, а вот дальше где теряется хз.

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Sat Aug 01, 2009 5:51 pm

Так.. не знаю как там в линухе, но в винде если положить pdb от wx рядом с программой то можно дебажить внутри сорцов wx. Попробуй так же сделать в линухе. в pdb файлах отладочная инфа.
А call stack окно в Code::Blocks что показывает когда стопает отладчик?
Какие именно wx-типы статических переменных?

madnut.ua
Knows some wx things
Knows some wx things
Posts: 31
Joined: Fri Dec 08, 2006 10:49 pm
Location: Ukraine
Contact:

Post by madnut.ua » Sat Aug 01, 2009 11:24 pm

T-Rex wrote:Так.. не знаю как там в линухе, но в винде если положить pdb от wx рядом с программой то можно дебажить внутри сорцов wx. Попробуй так же сделать в линухе. в pdb файлах отладочная инфа.
А call stack окно в Code::Blocks что показывает когда стопает отладчик?
Какие именно wx-типы статических переменных?
Такс.. Трейсить по wx можно и без pdb, если она собрана с дебагом (да и pdb я не нашел, думаю это VS-ного компилера заморочка). Заюзал IMPLEMENT_APP_NO_MAIN и доковырялся до скриншота. При инициализации wxEventEntryTableModule (кстати, как таки включить wxLogTrace?) мы попадаем в ту уже не раз упомянутую функцию
wxEventHashTable::ReconstructAll(). И в ней уже крутимся до посинения. Как-то так получается, что table (похоже, связной список) какой-то резиново бесконечный. То ли там какая бага возникает, что она сама на себя потом зацикливается, то ли кто-то в нее постоянно что-то ложит, но тогда бы по идее какой-нить overflow бы возник. А ничего не происходит. В общем, не знаю. Есть идеи, куда дальше рыть?

p.s. Кстати, в wx 2.9 этого метода (ReconstructAll) уже нет... но, увы, перейти пока нет возможности, так что приходится ковыряться с этим.
Attachments
EventTrace.png

madnut.ua
Knows some wx things
Knows some wx things
Posts: 31
Joined: Fri Dec 08, 2006 10:49 pm
Location: Ukraine
Contact:

Post by madnut.ua » Sun Aug 16, 2009 12:06 am

Ну что, больше нет никаких советов? Странно, что я один только с таким столкнулся :(

User avatar
T-Rex
Moderator
Moderator
Posts: 1195
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex » Sun Aug 16, 2009 7:17 am

Вобще да, действительно таких проблем не было.
Попробуй может обновления все скачать и wx удалить полностью (только удостовериться что wx-config тоже удален) и потом собрать и проинсталить из SVN из ветки 2.8 ?

Post Reply