これは奇妙な行動の日です。
Delphi 2007で作成されたWin32プロジェクトがあります。これは、.NETランタイムをホストし、移行期間の一部として.NETを呼び出して新しいフォームを表示します。
最近、コードのランダムな場所とポイントで例外が発生し始めました。算術オーバーフローまたはアンダーフローです。
これらのいずれかのスタックトレースは次のようになります。
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Gatsoft.Gat.UI.Windows.Forms.Remanaging.RemanageForm.DelphiOpenInNewMode(String employeeCode, String departmentCode, DateTime date) in C:\Dev\VS.NET\Gatsoft\Gatsoft.Gat.UI.Windows\Forms\Remanaging\RemanageForm.Delphi.cs:line 67
Visual Studioソリューションでは、最も優れたクラスライブラリの1つ(つまり、可能なすべての参照をプルする)が、Delphiプロジェクトの出力を対象とした特定のデバッグプログラムを設定しました。これにより、プログラムの大部分がDelphiで記述されている場合でも、VisualStudioから.NETコードをデバッグできます。
この問題は、exeファイルを直接(エクスプローラー、ショートカット、またはVisual Studio内で)実行した場合ではなく、デバッガーから実行した場合にのみ発生しCtrlます。F5
明らかに、マシンにはスパイウェアはありません(これが示唆するように)。
他に確認できることはありますか?
編集: .NETデバッガーがこのSNaNフラグを有効にしているように見えますが、Delphiデバッガーは有効にしていません。これについてはさらに調査する必要がありますが、今のところは@LorenzoBoccacciaの回答を受け入れます。
どうやら解決した
さて、ようやくこの問題を解決したようです。テスターにとっても、デバッガーを接続しなくても問題が発生し始めたため、問題の優先順位を上げる必要がありました。
最後に、問題が発生したマシンに共通する問題が1つ見つかりました。それは、2006年にラップトップのプロビジョニングに使用されたシステムイメージの古いドライバーを備えたNVIDIA QuadroNVS110Mを搭載したDellLattitudeD620ラップトップです。
ディスプレイドライバを更新するために再起動したときにURLを失いましたが、Webで1つの投稿を見つけました。これは、主にマシンが画面上で何かを実行しているときに.NETサービスがクラッシュしたためです。彼の問題を再現する1つの方法は、C:\へのコマンドプロンプトを開き、を実行してDIR /S
大量の画面更新を強制することでした。これにより、クラッシュがトリガーされます。
彼もNVIDIAビデオカードを持っていました。
私のマシンの問題は、プログラムの2〜4回の起動ごとに発生しましたが、ビデオドライバーを更新した後、問題なく123回の起動に成功しました。(ところで、私はそのようなことのためにAutoHotKeyをお勧めすることができます)。
つまり、古い/バギーなNVIDIAドライバーである犯人を見つけたようです。
この質問を更新して、将来誰かが時間を節約できるようにしました。
失礼しますが、隅で泣きます。
ジンクスド!
私はそれをジンクスしたに違いない。ビデオドライバを更新した後、同僚のラップトップが失敗するのと同じくらい早く、上記の更新を投稿しました。
それでも、私はそれが私たちのアプリケーションの外の問題であると確信しているので、どの特定のものを更新するかを理解することは残っています。
さらなる更新:わかりました。私のマシンは明らかに修正されましたが、同僚のマシンでは修正されていません。これまでのところ、BIOS、チップセットドライバーを更新しており、現在、XP用のSP3が導入されています。
バーンインテストは今夜行われ、起動中、または初めてWinForms .NETコードが実行されたときに問題が発生したため、アプリは一晩起動したままになります。このアプリは主にDelphiWin32アプリですが、.NETランタイムをホストしており、問題は.NETコードに関連しているようです。.NETランタイムを「起動」すると、問題が発生する可能性があります。または、Win32から最初の.NETウィンドウを起動すると、問題も発生する可能性があります。
統計的に、私は今このコードをリリースする準備ができています。一晩中、アプリケーションはエラーなしで3051回起動されましたが、ビデオドライバーを更新する前は、2〜4回ごとにクラッシュしました。
Prodded and found(!/?)
このバグ修正の試練は、医者に行くような気がします。そこで、次の会話が続きます。
Doc: Does this hurt?
Me: No...
Doc: What about now?
私はアプリケーションを突っ込んで突っ込みましたが、ついにこの問題を引き起こす何かを見つけたと思います。
このアプリでは、Delphi 2007 Win32アプリケーションからの.NETランタイムをホストし、グルーコードには次の行があります(現在)。
rc := CorBindToRuntimeEx('v2.0.50727', 'wks',
STARTUP_LOADER_OPTIMIZATION_MULTI_DOMAIN or STARTUP_CONCURRENT_GC,
@clsid, @iid, UnkRuntimeEngine);
真ん中の2つの定数は元々0でした。つまり、デフォルトを選択します。この変更は数か月前に導入されたものであり、この後、問題は徐々に私たちに忍び寄ってきました。この変更は、パフォーマンスプロファイリングを実行するためにANTSプロファイラーがWin32アプリケーションとホストされた.NETランタイムをロードするように促すために導入され、当時導入した変更によって機能しました。さらに、算術オーバーフロー/アンダーフローの問題は徐々に悪化しているので、変更後しばらくの間問題が発生しなかったので、私たちが行った変更のいずれにも起因していなかったに違いありません。
また、(元々)デバッガーを実行しているときにのみ問題が発生したため、VisualStudioやDelphiに問題があると考えました。
とにかく、統計的には、JavaScriptによってトリガーされた1つの画面上のブラウザーが上下に繰り返しスクロールすることで(明らかにバグをトリガーするために必要)、呼び出しで0を使用してアプリケーションを726回正常に起動できました。 、および2つの定数を使用して17回のうち5回クラッシュします。
Doc: Does this hurt?
そして、そもそも誰がその変更を行ったのかについては触れないようにしましょう。犯人は匿名のままにされたいと確信しています...咳