提供された API とライブラリを使用して、サードパーティのアプリケーションからデータを取得する、一種のデータ コンシューマー/ワーカーであるアプリケーションのバグを修正しています。これは C++ ベースの API であり、.net アプリケーションは少しの C++ を使用してライブラリにアクセスしています。また、アプリケーションはマルチスレッドであり、ウィンドウ (Winforms) であり、いくつかのサードパーティ ライブラリ (nhibernate、mysql など) を使用します。c++ ライブラリにアクセスするとき、コンシューマー スレッドがコード内の唯一の場所であることを追加することは適切かもしれません。
問題?プロデュース アプリケーションが閉じているとき (もう少し時間がかかり、1 分以上かかります)、コンシューマ アプリケーションはエラーや例外なしで数秒以内に終了します。イベント ログに情報がなく、ワトソン博士のアクションもありません。また、Visual Studio に例外もありません (デバッグは停止するだけです)。
私はもう試した:
- コード全体をステップ実行して、閉じる瞬間を確認しますが、それは常に別の場所で発生し、プロデューサーのライブラリ コードを呼び出すかどうかに関係なく発生します。
- 例外がスローされると中断するように構成された Visual Studio でアプリケーションをデバッグしましたが、何もせずに終了します。
- クラッシュ ダンプを作成し (ADPlus.vbs を使用)、windbg を使用します (ただし、このような低レベルのデバッグは初めてです) が、 !analyze の結果、スタック トレースが異なり、tracelessのままになりました。
コンシューマ アプリケーションが停止した理由を調べるには、どのような方向性がよいでしょうか? 問題を回避する方法はありますか (ユーザーにプロンプト メッセージを表示するなど)。
[編集]
コンシューマ アプリケーションはマルチスレッドであり、UI スレッドへのアドオンとしての 1 つのコンシューマ スレッドです。また、プロデューサーとして使用しているサード パーティ製アプリは、COM を使用して任意のコンシューマー アプリ (アドオン) に情報を送信します。
私と同僚は、問題を引き起こす可能性のあるコードを見つけるために、いくつかのコードをコメントアウトすることにしました。そして、おそらくそれを発見しました - コンシューマをプロデューサに登録した場合にのみ、アプリケーションは停止します。サード パーティ アプリのドキュメントを読んだ後、コンシューマー アプリはプロデューサーを閉じるメッセージを積極的にクエリする必要があることがわかりました。そうしないと、プロデューサー アプリによって強制的に終了されてしまいます。
つまり、95% の問題は、データをクエリしているサード パーティ アプリケーションが COM メッセージを送信して、アプリケーションを強制的に終了させていることです (情報を投稿するか、それが唯一の理由であるかをテストする場合は wiki に変更します)。