motif应用程序在调用XtDestroyWidget时崩溃

时间:2010-08-30 15:27:07

标签: crash xlib motif

我们有一个32位Motif Gui应用程序。现在我们将应用程序从Solaris移植到Linux,系统崩溃非常频繁。根据我们的分析,我们可以发现当我们关闭应用程序中的表单时会发生此问题。当表单关闭时,我们将删除表单并调用函数XtDestroyWidget()来删除窗口小部件。我们为应用程序运行了一个purify,我们发现在关闭表单时会发生Stack Array Bounds Read(SBR)。

我从互联网上下载了一个样本主题程序,它使用XtDestroyWidget()来销毁对象。当我为这个示例程序运行purify时,我可以找到相同的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]  main [popup.cc:49]  _start [crt1.o]   *从0xffbfe4f0读取4个字节。   *帧指针0xffbfe4d0   *地址0xffbfe4f0比函数XtCallCallbackList中的堆栈指针高32个字节。

此SBR发生在XtAppMainLoop()中。从这些事实来看,我认为这个SBR是一个常见的,与主题相关,而不是与我们的应用相关。

您能否对以下问题添加一些想法。 1)当我们使用XtDestroyWidget()时为什么会发生SBR。这个SBR是一个严重的。

2)我删除了XtDestroyWidget并使用了XtUnrealizeWidget()。这将帮助我删除SBR,因此不会发生崩溃。所有正常形式也将被正常删除。但我在这种方法中遇到的问题是POP_UP表单在此方法中未被删除。任何人都可以建议解决除HIDE选项以外的POP_UP表单。

如果有人可以回答或添加一些有关此问题的想法,那将对我非常有帮助。

提前致谢, Sanush Chacko

-----添加示例程序.. 你好 请从我获得SBR的地方找到示例程序。

包括X11 / StringDefs.h 包括Xm / Xm.h 包括Xm / PushB.h

Widget toplevel;

void close_window(Widget w,XtPointer client_data,XtPointer event_data) {     Widget popup =(Widget)client_data;     XtDestroyWidget(弹出); }

void pop(Widget w,XtPointer client_data,XtPointer event_data) { 小工具a,按钮,弹出窗口;

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 app;     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 个答案:

答案 0 :(得分:1)

您不应该在小部件调用的回调中销毁小部件。

每次单击按钮时,不是创建新的弹出窗口,而是在创建按钮时在程序开头创建弹出窗口,根据需要显示和隐藏弹出窗口,然后在XtAppMainLoop()返回后将其销毁。 / p>

这在性能方面更有效(但在内存方面效率稍差)。

我有点生疏,但我相信你也可以管理/取消管理小部件而不是隐藏/显示它。