2

作業中の VB.NET アプリケーションで、メモリ アクセス例外に関する問題が発生しています。私が行った調査のどれも問題を追跡するのに役立たなかったので、ここでいくつかの洞察を得たいと思っていました。

バックグラウンド:

多くのアプリケーションを VB6 から .NET 4.0 に変換しています。クライアントの要求に応じて、私は単純な変換を行っており、変換時にコードに他の問題が挿入されるのを避けるために、必要な場合にのみリファクタリングを行っています。ほとんどのアプリは任意の CPU モードでコンパイルされていますが、32 ビット PLC ソフトウェアまたは古いハードウェア ドライバーに依存しているため、一部は x86 としてコンパイルする必要があります。私の開発マシンは Windows 7 64 ビットです。

問題:

2 つのアプリを正常に変換した後、3 番目のアプリケーションがコードのランダムな場所でクラッシュしています。例外がキャッチされないので、イベント ログを確認する必要があります。メモリ アクセス例外であると思われる ntdll.dll の例外コード: 0xc0000005 が表示されます。アプリケーションは常に同じ場所でクラッシュするとは限らないため、追跡が困難になっています。ADODB の呼び出し中に多くのエラーが発生することに気付きましたが (常に同じ場所または同じ呼び出しであるとは限りません)、form.ShowDialog() の呼び出しでもクラッシュしました。

ShowDialog が呼び出されているフォームは、ADODB を使用してログ情報を DB に書き込みます。確認できていませんが、form.ShowDialog() 内の例外がこれらの ADODB 呼び出しのいずれかで発生していると推測しています。ADODB 呼び出しでのクラッシュは、変換された他の 2 つのアプリで正常に使用されているアセンブリで発生しており、同じ場所で一貫してクラッシュするわけではありません。

これに関する私の調査では、不適切な相互運用がこの問題を引き起こす可能性があることがわかりました。これらの呼び出しは他のアプリでは問題ありませんが、ADODB COM 呼び出しがこのアプリで何らかの問題を引き起こしているかどうか疑問に思っています。

明らかにこの例外をイベント ログにスローしている呼び出しを観察した場所のいくつか:

  • ADODB.recordset の新規作成
  • command.append 内での新しいパラメータの作成
  • connection.open 呼び出し

問題を根本原因まで追跡するためにこれを絞り込む方法を誰かが知っていますか? あなたが提供できる助けや洞察に感謝します。

4

1 に答える 1

0

ああ…私を連れ戻してくれるPLC。製造元が最新のドライバー セットを提供していない場合、困難な戦いになる可能性があります。発生する可能性が高いのは、新しい OS がはるかに高速であるか、コアが多いか、2 つの組み合わせがドライバー コードで「競合」状態を引き起こしていることです。これは、スレッド化が頻繁に使用される通信で特に当てはまります。ドライバー コードは C または C++ (アンマネージ) で記述されている可能性が高いため、これらの条件をあまり制御できない場合があります。アプリケーションが実行されているスレッド モデルをいじってみることができます。それで安定性が向上するなら、それでいい。

Visual Basic 6 でのアパートメント モデルのスレッド化

DotNet MTA スレッド属性

DotNet STA スレッド属性

最悪の場合、ドライバーを使用する別のプロセスを生成し、さまざまな「プロセス間通信」手法を使用してメイン アプリから通信することができます。クラッシュした場合は、別のアプリケーションを起動しますが、メイン アプリケーションは引き続き実行されます。最悪の場合を想定して、外部プロセスを VB6 アプリケーションとして作成することもできます。

幸運を。

于 2012-10-31T13:59:05.470 に答える