0

32 ビットの Motif Gui アプリケーションがあります。現在、アプリケーションを Solaris から Linux に移植しましたが、システムが頻繁にクラッシュしています。私たちの分析では、アプリケーションでフォームを閉じているときにこの問題が発生したことがわかりました。フォームが閉じられたら、フォームを削除し、関数 XtDestroyWidget() を呼び出してウィジェットを削除します。アプリケーションの浄化を実行したところ、フォームを閉じたときに 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 フォームを削除するための回避策を提案してください。

誰かがこの問題に答えたり、考えを追加したりできれば、私にとって非常に役に立ちます。

前もって感謝します、サヌーシュ・チャコ

-----サンプル プログラムの追加.. こんにちは、SBR を入手した場所からサンプル プログラムを見つけてください。

X11/StringDefs.h を含める Xm/Xm.h を含める Xm/PushB.h を含める

ウィジェットのトップレベル。

void close_window(Widget w, XtPointer client_data, XtPointer event_data) { Widget popup = (ウィジェット)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);

}

4

1 に答える 1