4

アプリケーションをDelphi7からDelphi2010に移植したところ、Windows XPで実行しているときに、断続的なBSOD(ブルースクリーン)エラーが発生することがありました。エラーは非常に散発的であり、追跡するのは非常に困難です。参考:Delphi2010の組み込みメモリマネージャを使用しています。

最初に考えたのはハードウェアの問題でしたが、システムドライバーをアップグレードしても問題は解決しませんでした。

Delphi 2010で生成されたアプリケーションを使用したXPでBSODの問題が発生した人は他にいますか?もしそうなら、この問題を修正する方法について何か提案はありますか?

ご協力ありがとうございます!

4

2 に答える 2

6

Delphi コア ライブラリには、BSOD を直接引き起こす可能性のあるものは何もありません。David が指摘したように、Delphi プログラムはユーザー空間で実行されます。ただし、カーネル空間ドライバーに無効なデータを送信している場合は、別の問題です。

D7-D2010 のアップデートとおっしゃいましたが、最初に思い浮かぶのは弦の改良です。Delphi の標準の文字列型は、AnsiString(1 文字あたり 1 バイト)から(1 文字あたりUnicodeString2 バイト)に変更されました。誤った型の文字列をドライバまたはシステム ルーチンのどこかに送信すると、奇妙な動作が発生する可能性があります。

最初に行うことは、完全なビルドを実行し、コンパイラからの「暗黙の変換」警告を監視することです。これは、文字列型を混在させていることを意味します。これらを見つけて修正し、それが役立つかどうかを確認してください。

また、外部ライブラリのインポート ユニットがあり、それらが文字列 (またはより可能性が高いPChar) パラメーターを取る API を使用している場合は、それらが に変換されていることを確認してくださいPAnsiChar。Delphi は で使用される Windows API については既にこれを処理していますが、独自のものwindows.pasがある場合は、自分で処理する必要があります。

于 2011-07-11T20:23:38.220 に答える
3

BSOD は、WinDbgまたはクラッシュ ダンプを処理できるその他のツールでクラッシュ ダンプを開いて分析できます。「ミニダンプ」でも、BDO が発生する場所とできれば理由を理解するのに十分な情報が得られます。WinDbg は自由にダウンロードでき、ターゲット マシンにインストールする必要はありません。顧客にクラッシュ ダンプを送付するように依頼し、オフラインで分析することができます。いずれにせよ、ユーザー モード コードから BSOD を生成することは通常非常に困難ですが、システムをクラッシュさせる方法はいくつかあります。BSOD はどのようなエラーを表示しますか?

更新: エラーが PAGE_FAULT_IN_NONPAGED_AREA の場合、このリンクで何が起こったかが説明されています: http://technet.microsoft.com/en-us/library/cc957625.aspx。これは通常、メモリ関連の問題であり、D2010 が古いバージョンよりも多くのメモリを使用していることが原因で発生する可能性があります。これらのマシンで memtest を実行していただけますか (http://www.memtest.org/)。

Ntkrlnpa.exe はドライバーではなく、OS の実行コードとカーネル コード (PAE をサポートするバージョン) を含むイメージです。winDbg とクラッシュ ダンプを使用すると、クラッシュの原因となったコール スタックを取得できます。

于 2011-07-11T20:41:25.247 に答える