У нас есть 32-битное приложение Motif Gui. Теперь мы перенесли приложение из Solaris в Linux, и система очень часто дает сбой. В нашем анализе мы обнаружили, что эта проблема возникла, когда мы закрываем формы в нашем приложении. Когда формы закрываются, мы удаляем формы и вызываем функцию XtDestroyWidget () для удаления виджетов. Мы выполнили очистку для приложения и обнаружили, что чтение границ стекового массива (SBR) происходит при закрытии формы.
Я скачал примерную программу-мотив из интернета, которая использует XtDestroyWidget () для уничтожения объекта. Когда я запустил очистку для этой программы, я смог найти тот же SBR.
SBR: считывание границ массива стека (54 раза):
* Это происходит во время:
XtDispatchEvent [libXt.so.4]
RemoveAllPMgr [libXm.so.3]
XtCallCallbackList [libXt.so.4]
XtPhase2Destroy [libXt.so.4]
_XtDoPhase2Destroy [libXt.so.4]
XtDispatchEvent [libXt.so.4]
XtAppMainLoop [libXt.so.4]
главная [popup.cc:49]
_start [crt1.o]
* Чтение 4 байтов из 0xffbfe4f0.
* Указатель кадра 0xffbfe4d0
* Адрес 0xffbfe4f0 на 32 байта выше указателя стека в функции XtCallCallbackList.
Этот SBR происходит в XtAppMainLoop (). Исходя из этих фактов, я предполагаю, что этот СРП является общим и связан с мотивом, а не с нашей заявкой.
Не могли бы вы добавить некоторые мысли к следующим вопросам.
1) Почему происходит SBR, когда мы используем XtDestroyWidget (). Является ли этот SBR серьезным.
2) Я удалил XtDestroyWidget и использовал XtUnrealizeWidget (). Это поможет мне удалить SBR и, следовательно, сбой не происходит. Также все нормальные формы будут удалены нормально. Но проблема, с которой я сталкиваюсь в этом подходе, состоит в том, что формы POP_UP НЕ удаляются в этом методе. Кто-нибудь может предложить обходной путь для удаления форм POP_UP, кроме опции HIDE.
Для меня будет очень полезно, если кто-нибудь сможет ответить или добавить некоторые мысли по этому вопросу.
Заранее спасибо,
Сануш Чако
----- Добавление примера программы.
Привет
Пожалуйста, найдите образец программы, откуда я получил SBR.
включает X11 / StringDefs.h
включают Xm / Xm.h
включает Xm / PushB.h
Виджет верхнего уровня;
void close_window (виджет w, данные клиента XtPointer, данные события XtPointer)
{
Widget popup = (Widget) client_data;
XtDestroyWidget (всплывающее окно);
}
void pop (виджет w, данные клиента XtPointer, данные события XtPointer)
{
Виджет, кнопка, всплывающее окно;
popup = XtVaCreatePopupShell("Popup", transientShellWidgetClass, toplevel, NULL);
button = XtVaCreateManagedWidget("Close", xmPushButtonWidgetClass, popup,
NULL);
XtAddCallback(button, XmNactivateCallback, close_window, (XtPointer)popup);
XtPopup(popup, XtGrabNone);
}
main (int argc, char * argv [])
{
Кнопка виджета;
Приложение XtAppContext;
Метка XmString;
toplevel = XtVaAppInitialize(&app, "Popup", NULL, 0,
&argc, argv, NULL, NULL);
label = XmStringCreateSimple("Make popup");
button = XtVaCreateManagedWidget("pushme", xmPushButtonWidgetClass, toplevel,
XmNlabelString, label,
NULL);
XmStringFree(label);
XtAddCallback(button, XmNactivateCallback, pop, NULL);
XtRealizeWidget(toplevel);
XtAppMainLoop(app);
}