我们有一个 32 位 Motif Gui 应用程序。现在我们将应用程序从 Solaris 移植到 Linux,系统经常崩溃。根据我们的分析,我们可以发现这个问题是在我们关闭应用程序中的表单时发生的。当表单关闭时,我们将删除表单并调用函数 XtDestroyWidget() 来删除小部件。我们为应用程序运行了一次净化,我们可以发现当我们关闭表单时发生了堆栈数组边界读取 (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 是一种常见的 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
小部件顶层;
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) { Widget a, button, popup;
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);