1

ユーザーから、アプリケーションがクラッシュし、イベント ビューアで次のように表示されたとの連絡を受けました。

Framework Version: v4.0.30319    
Description: The process was terminated due to an unhandled exception.
    Exception Info: System.AccessViolationException
    Stack:
       at System.Drawing.SafeNativeMethods+Gdip.GdipDrawRectangleI(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, Int32, Int32, Int32, Int32)
       at System.Drawing.Graphics.DrawRectangle(System.Drawing.Pen, Int32, Int32, Int32, Int32)
       at System.Windows.Forms.ToolStripTextBox+ToolStripTextBoxControl.WmNCPaint(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.ToolStripTextBox+ToolStripTextBoxControl.WndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Control+ControlNativeWindow.OnMessage(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Control+ControlNativeWindow.WndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr)
       at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr)
       at System.Windows.Forms.NativeWindow.DefWndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Form.DefWndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Control.WndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.ScrollableControl.WndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Form.WndProc(System.Windows.Forms.Message ByRef)
       at DeskandArchive.MainWindow.WndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Control+ControlNativeWindow.OnMessage(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.Control+ControlNativeWindow.WndProc(System.Windows.Forms.Message ByRef)
       at System.Windows.Forms.NativeWindow.Callback(IntPtr, Int32, IntPtr, IntPtr)
       at System.Windows.Forms.UnsafeNativeMethods.PeekMessage(MSG ByRef, System.Runtime.InteropServices.HandleRef, Int32, Int32, Int32)
       at System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr, Int32, Int32)
       at System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext)
       at System.Windows.Forms.Application+ThreadContext.RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext)
       at System.Windows.Forms.Application.Run(System.Windows.Forms.Form)
       at A.cc1462b28845fccfe3634174d36bc619a.ce1b648a1c328cbefe2529fb98bf21b8c()

インターネットで検索した限り、そしてこれから読むことができる限り、私のコードがクラッシュした場合、ユーザーが見なかったバグを報告するダイアログを表示する必要があるという事実も含めて、これはバグであるという結論に達しましたツールストリップの描画における .NET フレームワーク。

私はこれで正しいですか?これを修正できる方法はありますか?.NET フレームワークを再インストールするための提案を読みましたが、ほとんどの人はそれが役に立たなかったと報告していますか?

4

1 に答える 1

5

クラッシュしたのは ToolStrip ではなく、GDI+ です。GDI+ は、.NET が登場するずっと前から存在していたアンマネージ コードの塊であり、System.Drawing はそのラッパー クラスを持つ名前空間です。Graphics クラスと同様に、このスタック トレースで使用されます。

GDI+ がクラッシュすることは非常にまれです。.NET ラッパー クラスは、不正な引数が GDI+ の関数に渡されるのを防ぐのに非常に優れています。このような AccessViolation を取得するには、GDI+ が使用するヒープを破損する必要があります。ヒープは、アンマネージ コードのポインター バグによって破損します。それはあなたのコードである可能性があります。注目すべきは、WndProc() をオーバーライドしていることです。しかし、より一般的には、プロセスに自分自身を挿入するアプリです。ウイルス スキャナーのように意図的に、または OpenFileDialog を使用するときに読み込まれるシェル拡張ハンドラーのように意図的に。このような拡張機能は、GDI+ も使用できますが、それは一般的であるか、またはガベージをどこにでもスプレーする不適切なポインターを持っているだけです。

マネージド スタック トレースからは、GDI+ が機能しなくなるずっと前に損傷が発生していることを確認することはできません。これにより、ヒープ破損のバグの診断が非常に難しくなり、Java と .NET が非常に人気のあるプラットフォームになる大きな理由となっています。ユーザーのランタイム環境を正確に複製できない場合、それは不可能になります。このようなバグは、スタック トレースのみを証拠として Microsoft に提出した場合と同様に、ほとんどの場合「再現なし」でクローズされます。再現シナリオを追求するのはあなた次第ですが、非常に苦労することに注意してください。ユーザーに伝える最善の方法は、別のマシンを使用するか、不要または危険なプログラムをアンインストールして、マシンを再び安定させることです。特にシェル拡張。

于 2012-10-27T13:00:20.197 に答える