Может кто имел опыт работы под линухами, подскажите. Есть серьезная проблема, при попытке портировать аппликацию под 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)
Ubuntu, wxEventHashTable:ReconstructAll и critical sections
- T-Rex
- Moderator
- Posts: 1248
- Joined: Sat Oct 23, 2004 9:58 am
- Location: Zaporizhzhya, Ukraine
- Contact:
Значит что-то ты не так делаешь (с)Собирается нормально, запускается даже, но после этого тишина.
Как собрана wxWidgets? Дай командную строку для ./configure ?
Ммм.. Дебажить пробовал? Докуда доходит? логгинг через wxLogTrace() в крайнем случае.
Вложенные критические секции.. мм, а что ты ими хосешь реализовать? Может есть более другое решение, попроще? На мьютексы не пробовал перейти?
-
- Knows some wx things
- Posts: 31
- Joined: Fri Dec 08, 2006 10:49 pm
- Location: Ukraine
- Contact:
Это понятно, хотелось бы только понять что же все такиT-Rex wrote:Значит что-то ты не так делаешь (с)Собирается нормально, запускается даже, но после этого тишина.
См. в аттачеT-Rex wrote: Как собрана wxWidgets? Дай командную строку для ./configure ?
Дебажить не получается. Использую CodeBlocks, не доходит даже до точки входа. При попытке стопнуть он останавливается как раз на wxEventHashTable::ReconstructAll()T-Rex wrote: Ммм.. Дебажить пробовал? Докуда доходит? логгинг через wxLogTrace() в крайнем случае.
А как включить wxLogTrace, не нашел. Вроде и дефайн ставил, а все равно в логе нет таких сообщений
С помощью секций сделана синхронизация некоторых методов. И как раз часто возникают ситуации, когда метод вызвается еще раз будучи уже залоканым выше, что приводит к бесконечному ожиданию.T-Rex wrote: Вложенные критические секции.. мм, а что ты ими хосешь реализовать? Может есть более другое решение, попроще? На мьютексы не пробовал перейти?
А мьютексы, как именно заюзать? Хотя по сути в линуксе wxCriticalSection использует те же мьютексы.
- Attachments
-
- configure.7z
- (23.82 KiB) Downloaded 172 times
- T-Rex
- Moderator
- Posts: 1248
- Joined: Sat Oct 23, 2004 9:58 am
- Location: Zaporizhzhya, Ukraine
- Contact:
Как себя ведет приложение если wx собрать с ./configure без параметров?
Как себя ведет приложение если из проекта исключить все формы и в OnInit() создавать просто wxFrame?
В приложении если статические/глобальные переменные, не относящиеся к стандартными типам C++?
Есть ли в приложении статические wxBitmap/wxImage или изображения, которые теоретически могут попытаться загрузиться до wxImage::AddHandler() ?
Как себя ведет приложение если wxLogDebug(wxT("test")) написать в конструкторе класса приложения?
Как себя ведет приложение если запускать из gdb/ddd вручную?
Как себя ведет приложение если вместо IMPLEMENT_APP() заюзать IMPLEMENT_APP_NO_MAIN и руками написать main() и инициализацию wx и запуск wxEntry ?
Как себя ведет приложение если из проекта исключить все формы и в OnInit() создавать просто wxFrame?
В приложении если статические/глобальные переменные, не относящиеся к стандартными типам C++?
Есть ли в приложении статические wxBitmap/wxImage или изображения, которые теоретически могут попытаться загрузиться до wxImage::AddHandler() ?
Как себя ведет приложение если wxLogDebug(wxT("test")) написать в конструкторе класса приложения?
Как себя ведет приложение если запускать из gdb/ddd вручную?
Как себя ведет приложение если вместо IMPLEMENT_APP() заюзать IMPLEMENT_APP_NO_MAIN и руками написать main() и инициализацию wx и запуск wxEntry ?
-
- Knows some wx things
- Posts: 31
- Joined: Fri Dec 08, 2006 10:49 pm
- Location: Ukraine
- Contact:
Поставил готовый релиз 2.8.10 с помощью установщика пакетов из apt.wxwidgets.org - все без измененийКак себя ведет приложение если wx собрать с ./configure без параметров?
До OnInit вообще дело не доходит. См. ниже.Как себя ведет приложение если из проекта исключить все формы и в OnInit() создавать просто wxFrame?
Кроме стандартных типов С++ статически используются еще wxWidgets типы.В приложении если статические/глобальные переменные, не относящиеся к стандартными типам C++?
Вроде бы нетЕсть ли в приложении статические wxBitmap/wxImage или изображения, которые теоретически могут попытаться загрузиться до wxImage::AddHandler() ?
Выводит сообщение в консоль. Дебаггер тоже на нем стопается, но после этого больше никуда не попадает. Получается, что конструктор он еще проходит, а вот дальше где теряется хз.Как себя ведет приложение если wxLogDebug(wxT("test")) написать в конструкторе класса приложения?
- T-Rex
- Moderator
- Posts: 1248
- Joined: Sat Oct 23, 2004 9:58 am
- Location: Zaporizhzhya, Ukraine
- Contact:
Так.. не знаю как там в линухе, но в винде если положить pdb от wx рядом с программой то можно дебажить внутри сорцов wx. Попробуй так же сделать в линухе. в pdb файлах отладочная инфа.
А call stack окно в Code::Blocks что показывает когда стопает отладчик?
Какие именно wx-типы статических переменных?
А call stack окно в Code::Blocks что показывает когда стопает отладчик?
Какие именно wx-типы статических переменных?
-
- Knows some wx things
- Posts: 31
- Joined: Fri Dec 08, 2006 10:49 pm
- Location: Ukraine
- Contact:
Такс.. Трейсить по wx можно и без pdb, если она собрана с дебагом (да и pdb я не нашел, думаю это VS-ного компилера заморочка). Заюзал IMPLEMENT_APP_NO_MAIN и доковырялся до скриншота. При инициализации wxEventEntryTableModule (кстати, как таки включить wxLogTrace?) мы попадаем в ту уже не раз упомянутую функциюT-Rex wrote:Так.. не знаю как там в линухе, но в винде если положить pdb от wx рядом с программой то можно дебажить внутри сорцов wx. Попробуй так же сделать в линухе. в pdb файлах отладочная инфа.
А call stack окно в Code::Blocks что показывает когда стопает отладчик?
Какие именно wx-типы статических переменных?
wxEventHashTable::ReconstructAll(). И в ней уже крутимся до посинения. Как-то так получается, что table (похоже, связной список) какой-то резиново бесконечный. То ли там какая бага возникает, что она сама на себя потом зацикливается, то ли кто-то в нее постоянно что-то ложит, но тогда бы по идее какой-нить overflow бы возник. А ничего не происходит. В общем, не знаю. Есть идеи, куда дальше рыть?
p.s. Кстати, в wx 2.9 этого метода (ReconstructAll) уже нет... но, увы, перейти пока нет возможности, так что приходится ковыряться с этим.