crash - 调用XtDestroyWidget时,主题应用程序崩溃

标签 crash xlib motif

我们有一个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]
*从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(小部件w,XtPointer client_data,XtPointer event_data)
{
小部件弹出=(Widget)client_data;
XtDestroyWidget(popup);
}

void pop(小部件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);

}

最佳答案

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

不必每次单击按钮都创建一个新的弹出窗口,而是在创建按钮时在程序的开头创建一个弹出窗口,根据需要显示和隐藏该弹出窗口,然后在XtAppMainLoop()返回之后销毁它。

就性能而言,这效率更高(但就内存而言,效率略低)。

我有点使用rust ,但是我相信您也可以管理/取消管理小部件,而不仅仅是隐藏/显示它。

关于crash - 调用XtDestroyWidget时,主题应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3601818/

相关文章:

ios - 我的应用程序很简单应用程序崩溃了

c++ - std::map clear() 崩溃 - 多线程

C++ 和 XGrabKeyboard 键盘锁定

c - 如何在后台XCreateWindow?

linux - 在 Motif 中构建长滚动按钮小部件列表的正确方法是什么?

c - 如何隐藏 Motif 对话框/小部件的标题栏

redis -/var/run/redis/redis.pid 存在,进程已经运行或崩溃

c# - TID 5091中的致命信号11(SIGSEGV),代码1,故障加法器0x18

c++ - xlib XNextEvent 检查一个键是否被按下

linux - 将应用程序嵌入到窗口中