приложение мотива падает при вызове XtDestroyWidget - PullRequest
0 голосов
/ 30 августа 2010

У нас есть 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);

}

1 Ответ

1 голос
/ 28 декабря 2013

Вы не должны уничтожать виджет в обратном вызове, вызываемом виджетом.

Вместо создания нового всплывающего окна при каждом нажатии кнопки, создайте всплывающее окно в начале программы при создании кнопки., показать и скрыть всплывающее окно, как требуется, а затем уничтожить его после возврата XtAppMainLoop ().

Это более эффективно с точки зрения производительности (но немного менее эффективно с точки зрения памяти).

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

...