2

サポートを提供する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)ます。多くのライブラリは同じフォルダにありますが、すべて登録されています。

4

1 に答える 1

2

ピーター、私はしばしば、実際のアセンブリ言語のどこで障害が発生するかに応じて、デバッガーが実際には正しくないコード行を示すことに気づきました。カーソルをに設定するステートメントの周りを実際によく見る必要がありますvbHourGlass。例外は、そのコード行の前に発生している可能性がありますが、その行は、デバッガーが実際に障害が発生したコード行であると見なすものです。

ウィンドウが開いたときに発生するとおっしゃっていたので、フォームで参照している可能性があるが、実際には使用されていない、または呼び出されていない可能性のあるocxを実際に詳しく調べます。あなたはそこにいるつもりのないものを持っているかもしれません、それはセキュリティ問題、またはWin7の何かを引き起こしている可能性がありますか?必要に応じて.frmファイルを手動で編集し、フォームが参照するすべてのGUIDを確認します。

一方のマシンがPER-USER登録を使用していて、もう一方のマシンがPER-SYSTEM登録を使用している可能性がありますか?知らない...

私はあなたが開こうとしているフォームをもっとよく見て、フォームのロードイベントなどであなたがしていることすべてに非常に注意します。これは、あるシステムでWindows Aeroが有効になっているのと同じくらいばかげているように聞こえますが、別のシステムでは有効になっていないか、VBフォームレンダリングルーチンをヒスフィットに投げ込んでいる他の種類の「テーマ」設定です...おそらくばかげているようなものです。そのために選択したアイコンの透明なカラーインデックスとして?

このアプリをまだ開発中(または少なくとも維持中)の場合は、まったく新しいフォームを作成し、フォーム上にすべてのコントロールなどを再作成します(古いものからコピー/貼り付けする誘惑に抵抗します)。 。)、それがうまくいくかどうかを確認します。次に、すべてのイベントコードを一度に1つのイベントで新しいフォームにコピーします。少なくとも、フォームが機能するのに十分なイベントコードを使用します。これは、単なる「デッドフォーム」、データを読み込まない、またはフォームが想定しているものであっても、やること。変更するたびに確認してデバッグすると、最終的には見つかります。もちろん、機能していないシステムの1つを分離して、問題を再現できるプラットフォームを用意するようにしてください。そうしないと、推測にすぎません。ユニバーサルリストア付きのAcronisのようなものを使用することは、VirtualBoxのような優れたHVにイメージファイルを取り込むための優れたオプションであることがわかりました。次に、そのイメージをVMとして復元します。これにより、実際のユーザーに干渉することなくデバッグできます。これは大変な作業のように聞こえますが、それでも、既存のアプリケーションを書き直すのではないでしょうか。:)

それが失敗した... /*そして*/あなたの友達です!! (まあ、私たちはVBを扱っているので、'あなたの親友になります!ええと...しかし、私はその吸盤が開くまでフォーム上のすべてのコードをコメントアウトし始めます。それからそれが開いたら、1行を元に戻し始めます時間、そしてそれを再実行する...それは「VooDooデバッグ」と呼ばれます、しかし時々、あなたはあなたがしなければならないことをしなければなりません...

たくさんのピーターに感謝します!:)今、あなたはをこれにとても関与させました、私はこの吸盤をデバッグしている人のよう感じます!それが私のコードであるかのように、私は修正しようとしていました!:)

これが役立つかどうか教えてください...私は実際にあなたが発見したものに非常に興味があります。

于 2013-12-06T07:15:12.650 に答える