5

バックグラウンド

コンソールアプリケーションを介してハンドヘルドストアスキャナーにインターフェイスする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オブジェクトのスレッドモデルを決定できますか?

4

2 に答える 2

2

次のコマンドを使用して、スレッドの状態をダンプできます。

~*

これは「背景」を状態として表示せず、実行中、フリーズ、または一時停止のみが表示されます。

COMオブジェクトから情報を取得する方法がわかりません。試したことはありませんが、調査して返信します。スレッドモデルに関しては、ステップスルーした後、さらにはつまり、他のすべてのスレッドをステップスルーすると、すべてのスレッドを現在のスレッドに同期するを使用しない限り実行されます.bpsync 1が、ハングが発生する可能性があります(たとえば、GUIスレッドがフリーズするように指示されています)。ソースコードへのアクセス。

于 2012-05-18T09:50:45.673 に答える
1

質問1にしか答え!runawayられません。CPUを消費している1つまたは複数のスレッドを見つけるために使用します。すべてのスレッドスタックを取得するには、を使用します~*kb1000

于 2012-05-17T14:39:15.063 に答える