【发布时间】:2011-04-05 20:01:20
【问题描述】:
我们有一个 32 位 Motif Gui 应用程序。现在我们将应用程序从 Solaris 移植到 Linux,系统经常崩溃。根据我们的分析,我们可以发现这个问题发生在我们关闭应用程序中的表单时。当表单关闭时,我们将删除表单并调用函数 XtDestroyWidget() 来删除小部件。我们为应用程序运行了一次净化,我们可以发现当我们关闭表单时发生了堆栈数组边界读取 (SBR)。
我从 Internet 下载了一个示例主题程序,它使用 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] 主要 [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 表单在这种方法中没有被删除。除了隐藏选项之外,任何人都可以建议一种解决方法来删除 POP_UP 表单。
如果有人可以回答或添加一些想法,这对我将非常有帮助。
提前致谢, 萨努什查科
-----添加示例程序.. 你好 请从我获得 SBR 的地方找到示例程序。
包括 X11/StringDefs.h 包括 Xm/Xm.h 包括 Xm/PushB.h
小部件顶层;
void close_window(Widget w, XtPointer client_data, XtPointer event_data) { 小部件弹出窗口 = (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 应用程序; 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);
}
【问题讨论】:
-
显示您的代码,或者您从互联网上获得的示例。您认为任何人都可以从调试器中的十六进制 # 中弄清楚这一点吗?
-
请找到包含示例程序的原始帖子