背景如何從Visual Basic轉儲文件中檢查COM對象?
我們必須寫在通過一個控制檯應用程序接口的手持式掃描儀店C#.NET程序WinForms應用程序。控制檯應用程序使用良好的VB6編寫 - 不存在託管代碼。 VB6應用程序由多個COM對象組成。
.NET WinForms應用程序通過調用帶有正確參數的控制檯應用程序來刷新掃描器中的數據。當控制檯應用程序啓動時,它會彈出一個模式表單,提醒用戶將手持設備放入其支架。
問題
客戶有一個奇怪的情況,即調用啓動控制檯應用程序似乎掛起它顯示的提示形式之前。如果用戶按下任何按鍵 - 即使是像Shift或Alt這樣無辜的東西 - 應用程序解凍,並出現提醒表單。掛起時,控制檯應用程序的CPU使用率非常高。
我們使用ProcDump從命令行應用程序獲得了內存轉儲。我有一些調試管理轉儲文件的經驗,但這個VB 6轉儲對我來說很陌生。
我們在一行中捕獲了幾個完整的內存轉儲。在其中一些中,似乎存在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對象的線程模型嗎?
是否所有的VB6都是你的,或者你是否也在調用第三方COM對象? – tcarvin
據我所知,所有的VB6 COM對象都是我們的。 –
那麼我認爲查看線程不會太多,因爲VB6不支持多線程。最接近它的是支持多個孤立STA(單線程公寓)的ActiveX服務器。 – tcarvin