0

ある顧客のマシンで、私のアプリ、WPF C#.NET 3.5 VS2008 に問題があります。私のアプリは、さまざまな Windows マシン (XP、Vista 32/64、Win7 32/64) に 1000 近くインストールされており、これまでのところ問題はありません。

Win7 32 PC で問題が発生しているように見えるのは 1 つだけです。

現在のアクティビティに応じたタスク マネージャーの概要:

1 - 活動:プログラム開始

http://i.stack.imgur.com/jA6j7.gif (写真を参照)

2 - アクティビティ:メニュー項目、ボタンなどの単純なクリック

http://i.stack.imgur.com/e0erH.gif (写真を参照)

オブジェクト USERオブジェクト GDIは 10'000 まで実行され、アプリは次の例外をスローします。

System.ComponentModel.Win32Exception The current process has used all of its system allowance of handles for Window Manager objects 

à MS.Win32.UnsafeNativeMethods.CreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
   à MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   à System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
   à System.Windows.Interop.HwndSource..ctor(HwndSourceParameters parameters)
   à System.Windows.Window.SetTaskbarStatus()
   à System.Windows.Window.CreateAllStyle()
   à System.Windows.Window.CreateSourceWindowImpl()
   à System.Windows.Window.SafeCreateWindow()
   à System.Windows.Window.ShowHelper(Object booleanBox)
   à System.Windows.Window.Show()
   à System.Windows.Window.ShowDialog()
   à WPFControls.WPFMessageBox.Show(String title, String message, String details, WPFMessageBoxButtons buttonOption, WPFMessageBoxImage image)
   à MyApp.Prolog.Application_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e)
   à System.Windows.Threading.Dispatcher.CatchException(Exception e)
   à System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e)
   à System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler)
   à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   à System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   à MS.Win32.UnsafeNativeMethods.SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter, Int32 x, Int32 y, Int32 cx, Int32 cy, Int32 flags)
   à System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
   à System.Windows.Window.CreateSourceWindowImpl()
   à System.Windows.Window.SafeCreateWindow()
   à System.Windows.Window.ShowHelper(Object booleanBox)
   à System.Windows.Window.Show()
   à System.Windows.Window.ShowDialog()
   à WPFControls.WPFMessageBox.Show(String title, String message, String details, WPFMessageBoxButtons buttonOption, WPFMessageBoxImage image)
   à MyApp.Prolog.Application_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e)
   à System.Windows.Threading.Dispatcher.CatchException(Exception e)
   à System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e)
   à System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler)
   à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   à System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   à MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   à System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   à System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   à System.Windows.Window.ShowHelper(Object booleanBox)
   à System.Windows.Window.Show()
   à System.Windows.Window.ShowDialog()
   à MyApp.Prolog.Prolog_Startup(Object sender, StartupEventArgs e) 0 0 0

誰でも助けてください。


更新 - 編集

私たちの顧客は(彼が言ったように)新しいクリーンなWin 7 64 OSをセットアップしましたが、問題はまだ存在しています。WPF アプリの使用が機能していないようです。

また、この記事 (msdn.microsoft.com/de-de/magazine/dd419663.aspx) の MVVM Demo App を、John Smith が Customers Machine で使用しようとしました。

メニュー項目、ボタンをクリックするか、ドロップダウン リストで何かを選択しようとすると、MVVM デモ アプリもクラッシュします。テキストフィールドにテキストを入力しても問題ありませんが、クリックして選択すると、アプリケーションが機能しないというエラーで MVVM デモ アプリが停止します。

ここに私のアプリのイベントログがあります

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    - <System>
        <Provider Name="Application Error" />
        <EventID Qualifiers="0">1000</EventID>
        <Level>2</Level>
        <Task>100</Task>
        <Keywords>0x80000000000000</Keywords>
        <TimeCreated SystemTime="2013-02-07T11:04:13.000000000Z" />
        <EventRecordID>2243</EventRecordID>
        <Channel>Application</Channel>
        <Computer>RSSec.Machine.local</Computer>
        <Security />
    </System>
    - <EventData>
        <Data>MyApp.exe</Data>
        <Data>2.0.16.0</Data>
        <Data>51136bd8</Data>
        <Data>unknown</Data>
        <Data>0.0.0.0</Data>
        <Data>00000000</Data>
        <Data>c000041d</Data>
        <Data>74494f0d</Data>
        <Data>ecc</Data>
        <Data>01ce0522d9d3bc67</Data>
        <Data>C:\Program Files (x86)\MyApp\MyApp.exe</Data>
        <Data>unknown</Data>
        <Data>1ad6d91f-7116-11e2-87c7-10604b689bfe</Data>
    </EventData>
</Event>

誰でもまた助けてもらえますか? どうも

4

2 に答える 2

4

コードには、スタック トレースから明らかな問題が少なくとも 1 つあります。Dispatcher.UnhandledException イベントのイベント ハンドラーを作成し、例外をメッセージ ボックスに表示しました。このメッセージ ボックスが既に表示されている場合は、これを避けるようにしてください。トレースに MyApp.Prolog.Application_DispatcherUnhandledException() が複数出現することで確認できます。

したがって、ユーザーが1 万個のメッセージ ボックスで満たされた画面を見ている可能性があります。その後、プログラムがそれ以上作成することを拒否したときに、Windows はプラグを抜いた。

実際の例外がどのように見えるかはまだわかりません。しかし、ディスパッチャ ループの実行時に何度も何度もスローされる、ひどいものである可能性があります。クラッシュした本当の理由を知るには、未処理の例外処理を改善する必要があります。 メッセージ ボックスが表示されていることを示す bool フラグを追加し、フラグが true に設定された状態で UnhandledException が再度発生したときにプログラムを終了してくださいまた、例外をログに記録して、ユーザーがメッセージ ボックスの内容を読み返さなくても、何がスローされたかを確認できるようにします。

于 2013-01-30T12:36:16.297 に答える
1

すべての Windows プラットフォームには、ハンドルの制限があります。古いものは 16000 まで低くなることもありました。古いものは、画面上の 1 つのコントロール (テキスト ボックス、ボタン) ごとに 1 つのハンドルを消費していました。古いものは制限をチェックしないことさえあり、ウィンドウの半分しか開いていないときもありました。 UI デザイン (WinForms で 100,000 行の仮想化なしのリピーターを表示し、それぞれにボタン/テキスト編集を入れてみてください!)、または UI/IO/etc アイテムを適切に NOT-FREEing することで、アプリケーションがハンドルをリークしました。または、一度に何百万ものファイルを開こうとしましたが、それは明らかであり、可能性ははるかに低くなります。

とにかく、例外にはハンドルからウィンドウマネージャーへの指示があるため、UI がすべてです。

おそらく、どのハンドルがリークしているかを診断する最も速い方法は、MSDN から ProcessExplorer や SourceForge から ProcessHacker2 などのプログラムを取得し、クラッシュの直前に何が起こっているかを調べることです。

上記のアプリケーションを使用すると、任意のアプリケーションによって現在開いているハンドルを表示できるだけでなく (ここでは、保留中の I/O、Mutex などについて学習します)、現在のウィンドウ階層を調べることもできます (そこで、どのウィンドウを学習するかがわかります)。 /controls が解放されていないか、どのコントロールが不必要に複数作成されたか)。おそらく、それは非常にアプリケーション固有であるためです。Proceshacker を使用すると、「コメントの追加」ウィンドウが 10000 回開かれることを正確に確認できる場合もありますが、「ウィンドウ」への 10000 個のハンドルがハングしていることに気付くだけの場合もあります。

もちろん、それはまだ始まったばかりです。次に、原因を見つけて修正する必要があります。しかし、少なくともそれはいくつかの始まりであり、さらにどこを見ればよいかがわかります。

于 2013-01-30T11:04:53.160 に答える