バックグラウンド
コンソールアプリケーションを介してハンドヘルドストアスキャナーにインターフェイスするC#で記述された.NETWinFormsアプリケーションがあります。コンソールアプリケーションは古き良きVB6で書かれています---そこにはマネージコードはありません。VB6アプリケーションは、いくつかのCOMオブジェクトで構成されています。
.NET WinFormsアプリケーションは、適切なパラメーターを使用してコンソールアプリケーションを呼び出すことにより、スキャナーのデータを更新します。コンソールアプリケーションが起動すると、モーダルフォームがポップアップ表示され、ハンドヘルドデバイスをクレードルに配置するようにユーザーに通知します。
問題
顧客は、コンソールアプリケーションを開始するための呼び出しが、リマインダーフォームを表示する前にハングしているように見えるという奇妙な状況にあります。ユーザーがいずれかのキー(ShiftやAltなどの無害なものでも)を押すと、アプリケーションのフリーズが解除され、リマインダーフォームが表示されます。ハングしている間は、コンソールアプリケーションのCPU使用率が非常に高くなります。
ProcDumpを使用して、コマンドラインアプリケーションからメモリダンプを取得しました。管理されたダンプファイルのデバッグの経験はありますが、このVB6ダンプは私には奇妙です。
いくつかのフルメモリダンプを連続してキャプチャしました。それらのいくつかでは、COM接着剤スタックがあるように見えます。たとえば、いくつかのダンプファイルは次のような呼び出しスタックを示しています。
msvbm60!BASIC_DISPINTERFACE_GetTICount
msvbm60!_vbaStrToAnsi
msvbm60!IIDIVbaHost
msvbm60!rtcDoEvents
msvbm60!IIDIVbaHost
msvbm60!BASICCLASS_QueryInterface
[our code which I think is trying to create and invoke a COM object]
私が持っている唯一のシンボルが私たちのコードからのものであることは助けにはなりません。Microsoftシンボルサーバーには、msvbm60.dll用のPDBファイルがありません(または、少なくともそれらのバージョンである6.0.98.2からはありません)。
質問
彼らのシステムでのみ発生しているCOMスレッドの問題があるのではないかと疑っています。
1)ダンプファイル内の各スレッドのスレッド状態を確認するにはどうすればよいですか?これがマネージドダンプファイルの場合、スレッドの状態を調べ!threads
て!threadstate
把握します。マネージコードがないので、sos.dllは使えません。~
とを使用したヒントは表示されませんでした!teb
。
2)ダンプファイルに作成されたCOMオブジェクトを確認する方法はありますか?繰り返しますが、管理対象ダンプでは、!dumpheap
管理対象オブジェクトのリストを取得するためにを実行できます。COMオブジェクトに似たようなものはありますか?
3)ダンプファイル内のCOMオブジェクトのスレッドモデルを決定できますか?