作業中の 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 呼び出し
問題を根本原因まで追跡するためにこれを絞り込む方法を誰かが知っていますか? あなたが提供できる助けや洞察に感謝します。