2012-05-16 43 views
5

背景如何從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對象的線程模型嗎?

+0

是否所有的VB6都是你的,或者你是否也在調用第三方COM對象? – tcarvin

+0

據我所知,所有的VB6 COM對象都是我們的。 –

+0

那麼我認爲查看線程不會太多,因爲VB6不支持多線程。最接近它的是支持多個孤立STA(單線程公寓)的ActiveX服務器。 – tcarvin

回答

1

我只能回答問題1.使用!runaway來查找消耗CPU的線程。要獲得所有線程堆棧,請使用~*kb1000

+0

我也想看到線程狀態信息。線程狀態與「背景」或「運行」或「終止」一樣。 –

2

您可以通過使用命令轉儲線程狀態:

~* 

這將不顯示「背景」作爲一個國家,你只會看到運行,凍結或暫停。

我不知道如何從COM對象獲取信息,我從來沒有嘗試過,但會調查並回復給您,關於線程模型,將很難推斷,如果沒有痛苦的監控後的應用程序狀態通過,甚至與此,當你通過所有其他線程的步驟將運行,除非你使用.bpsync 1它將所有線程同步到當前的線程,但這可能會導致掛起(例如,現在已經告訴gui線程凍結),所以我認爲它會除非您有權訪問源代碼,否則很難。

相關問題