サポートを提供するVB6アプリケーションがあります。このアプリケーションは、WindowsXPとWindows7の両方で動作します。一部のユーザーは、ユーザー状態移行ツールを使用してWindowsXPからWindows7に移行されました。これらのユーザーは、アプリケーションで特定の画面(フォーム)を開くと、一般的な「アプリケーションがクラッシュしました」というWindowsエラーメッセージを受け取るようになりました。私の仮定では、dll / ocx参照が欠落していると思いますが、それを追跡するのに問題があります。
私は多くの/さまざまなトラブルシューティング手法を試しました:
- アプリケーションの完全なアンインストールと再インストール
- 使用されていることがわかっているすべてのdllとocxを手動で再登録する
- 壊れたコンピューターと動作中のコンピューターでProcessMonitorを実行して、アクセスされているdllとocxを比較します。答えはここにあるかもしれませんが、バックグラウンドノイズのほとんどを除去した後でも、データの量は圧倒的です。少なくとも、クラッシュする直前のすべての呼び出しと、成功しなかったすべての呼び出しを確認しました。失敗した呼び出しはすべて、機能しているものと機能していないものの間で一致します。
- Windowsデバッガツールをインストールし、クラッシュダンプをキャプチャしました。DebugDiagを使用してクラッシュダンプを分析しました。DebugDiagは、例外がmsvbvm60.dllにあると言います。exe用のPDBファイルを作成し、それをDebugDiagにロードして、例外が発生している場所の詳細を取得しようとしましたが、DebugDiagはPDBを受け入れたくありません(ここで何か問題が発生している可能性がありますが、無視しているようです。ただし、リモートデバッグを行う場合、この同じPDBファイルは正常に機能します。)
- PCodeを最適化せずにVB6プログラムを再コンパイルしました。私はオンラインで読んだことがありますが、PCodeを組み込むと、パフォーマンスは低下しますが、本当の例外がわかります。
- 上記で作成したPDBファイルを使用して、VB6アプリケーションをリモートデバッグしました。デバッガーは、新しいウィンドウが作成された後、設定された行でアプリケーションがクラッシュすると言います
MousePointer = vbHourGlass
...私には、これがエラーの本当の原因である可能性は低いようです。プログラムには、この同じ行が呼び出され、すべて正常に機能する場所が少なくとも20か所あります。(これを忘れた) - Dependency Walkerを使用し、動作しているコンピューターと動作していないコンピューターの両方でアプリケーションのプロファイルを作成しました。依存関係ウォーカーによって検出されたすべてのエラーは、2台のコンピューター間で同じでした。動作中のコンピューターには追加の依存関係は見つかりませんでした。また、動作していないコンピューターで欠落している依存関係はすべて、動作中のコンピューターでも欠落していました。
これらのアクションのいずれも、エラーメッセージを変更したり、エラーが何であるかを示したりしませんでした(実際にマウスカーソルの問題でない限り)...アプリのクラッシュに関連するWindowsイベントログのエントリはありません。
動作していないコンピューターと動作しているコンピューターはすべて同じベースのWindows7イメージを持っていますが、唯一の違いはUSMTによって変更されているものであり、これはある種の風変わりな構成変更またはdll / ocxの欠落、あるいは未登録であると私にさらに確信させますdll/ocx。
問題の根本原因を突き止める方法についてのアイデアや考えをいただければ幸いです。
更新1-質問への回答
@MarkHallUACをオフにしていないのに、管理者として実行してみました。アプリケーションは、完全なUACを持つ非管理者としてWindows7ボックスで正常に実行されます。Windows XPは32ビット、Windows 7は64ビットですが、ユーザーがWindows XPから移行されていないようなボックスでも、問題なく動作します。
@Beaner破損した設定がどこかに保存されている可能性がありますが、リモートデバッグでは、UIに関連するステップで停止しているように見えるため、他の何かである可能性が高いと思われます。 dll/ocxリファレンス。
@Bob77アプリケーションはにインストールされProgram Files (x86)
ます。多くのライブラリは同じフォルダにありますが、すべて登録されています。