質問

今日は奇妙な行動が起こる日です。

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 で書かれている場合でも、Visual Studio から .NET コードをデバッグできるようになります。

この問題はデバッガーから実行した場合にのみ発生し、exe ファイルを直接 (エクスプローラー、ショートカット、または Ctrl+F5 Visual Studio 内)。

どうやらマシン上にはスパイウェアはないようです (示唆されているように) これ).

他に確認できることはありますか?


編集: .NET デバッガではこの SNaN フラグが有効になっているようですが、Delphi デバッガでは有効になっていないようです。これについてはさらに調査する必要がありますが、今のところは受け入れます @ロレンツォ・ボッカッチャさんの答え。

どうやら解決したようです

さて、ついにこの問題を解決できたようです。テスターに​​とっては、デバッガが接続されていない状態でも問題が発生し始めたため、問題の優先順位をかなり上げなければなりませんでした。

最後に、この問題が発生したマシンに共通の問題が 1 つ見つかりました。それらは NVIDIA Quadro NVS 110M を搭載した Dell Lattitude D620 ラップトップで、2006 年にラップトップのプロビジョニングに使用されたシステム イメージからの古いドライバーが使用されていました。

Web 上で 1 つの投稿を見つけました。ただし、ディスプレイ ドライバーを更新するために再起動したときに URL を失いましたが、主にマシンが画面上で何かを行っているときに .NET サービスがクラッシュしました。彼の問題を再現する 1 つの方法は、コマンド プロンプトを C:\ で開き、次のコマンドを実行することでした。 DIR /S 大量の画面更新を強制するだけで、クラッシュが発生します。

彼も NVIDIA ビデオ カードを持っていました。

私のマシンでは、プログラムのおよそ 2 ~ 4 回の起動ごとに問題が発生しましたが、ビデオ ドライバーを更新した後は、123 回の起動に問題なく成功しました。(ところで、私はお勧めできます オートホットキー そのようなもののために)。

したがって、原因は古い/バグのある NVIDIA ドライバーであることが判明したようです。

おそらく将来の誰かが時間を節約できるように、この質問を更新しました。

さて、失礼しますが、隅っこで泣きに行きます。

ジンクス!

ジンクスをしたに違いない。私が上記のアップデートを投稿するとすぐに、同僚のラップトップがビデオ ドライバーをアップデートした後に故障しました。

それでも、現時点ではこれがアプリケーションの外部に問題があることは確かなので、あとは具体的にどの項目を更新するかを判断するだけです。


さらなるアップデート:さて、私のマシンはどうやら直ったようですが、同僚のマシンはそうではありません。これまでのところ、BIOS、チップセット ドライバーを更新しており、現在 XP 用の SP3 がリリースされつつあります。

今夜、バーンイン テストが行​​われます。問題は起動中、または WinForms .NET コードの最初の実行時に発生したため、アプリは一晩起動したまま放置されます。このアプリは主に Delphi Win32 アプリですが、.NET ランタイムをホストしており、問題は .NET コードに関連しているようです。.NET ランタイムを「起動」するときに問題が発生する場合もあれば、Win32 から最初の .NET ウィンドウを起動するときに問題が発生する場合もあります。


統計的には、今すぐこのコードをリリースする準備ができています。一晩で、アプリケーションはエラーなしで 3051 回起動されましたが、ビデオ ドライバーを更新する前は 2 ~ 4 回ごとにクラッシュしていました。

つついて見つかった(!/?)

このバグ修正の試練は医者に行くような気分で、そこで次のような会話が続きます。

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 ランタイムをロードすることを奨励するために導入されました。また、当時導入した変更により、それが機能するようになりました。さらに、算術オーバーフロー/アンダーフローの問題は徐々に悪化しているため、変更後しばらくは問題が発生しなかったため、私たちが行った変更に起因するものではなかったと思います。

また、(当初は) デバッガーを実行しているときにのみ問題が発生したため、Visual Studio や Delphi に何か問題があるのではないかと考えました。

とにかく、統計的には、現在、JavaScript によってトリガーされた 1 つの画面上のブラウザーで上下のスクロールを繰り返し (バグをトリガーするために必要であると思われます)、呼び出しに 0 を指定してアプリケーションを 726 回正常に起動できました。 、そこに 2 つの定数があると 17 回中 5 回クラッシュします。

Doc: Does this hurt?

そして、そもそも誰がその変更を行ったのかには立ち入らないようにしましょう。犯人は匿名を望んでいるに違いない…

役に立ちましたか?

解決

リンクされた DLL のデバッグ バージョンは、nan サポートを通知してコンパイルできます。を参照してください。 http://blogs.msdn.com/oldnewthing/archive/2008/07/02/8679191.aspx この問題の例として。

ハイゼンバグは初期化されていない変数が原因でした。ここでは、CPU の snan 機能を有効にし、戻ったときにそれを無効にするのを忘れていたリンクされた DLL が存在する可能性があります。

他のヒント

アプリケーション起動後にデバッガをアタッチしてもエラーは発生しますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top