【问题标题】:motif application crashes while calling XtDestroyWidget调用 XtDestroyWidget 时主题应用程序崩溃
【发布时间】: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);

}

【问题讨论】:

  • 显示您的代码,或者您从互联网上获得的示例。您认为任何人都可以从调试器中的十六进制 # 中弄清楚这一点吗?
  • 请找到包含示例程序的原始帖子

标签: crash xlib motif


【解决方案1】:

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

与其每次点击按钮都创建一个新的弹出窗口,不如在创建按钮时在程序开始时创建一个弹出窗口,根据需要显示和隐藏弹出窗口,然后在 XtAppMainLoop() 返回后将其销毁。

这在性能方面效率更高(但在内存方面效率略低)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多