2012-05-16 16 views
5

COM Nesneleri Visual Basic Döküm Dosyasından Nasıl İncelenir?

Arkaplan Biz bir konsol uygulaması aracılığıyla bir el mağaza tarayıcıya arabirimleri C# ile yazılmış bir .NET WinForms uygulama var. Konsol uygulaması iyi ol 'VB6 - orada yönetilen kod yok yazılmıştır. VB6 uygulaması birkaç COM nesnesinden oluşur.

.NET WinForms uygulama doğru parametrelerle konsol uygulaması çağırarak tarayıcı verileri yeniler. Konsol uygulaması başladığında, kullanıcıyı el cihazını yuvasına yerleştirmek için kullanıcıyı hatırlatan modal bir form açılır.

Sorun

Bir müşteri çağrı konsol uygulaması bu hatırlatma formunu görüntüler önce askıda görünüyor başlatmak üzere bir araya geldiği tuhaf bir durum var. Eğer kullanıcı herhangi bir tuşa basarsa - Shift veya Alt gibi masum bir şey bile olsa - uygulama çözülür ve hatırlatma formu görüntülenir. Takılıyken konsol uygulamasının CPU kullanımı çok yüksektir.

Biz ProcDump kullanarak komut satırı uygulamasından bir bellek dökümü elde ettik. Yönetilen döküm dosyaları hata ayıklama konusunda bazı deneyimlerim var, ancak bu VB 6 dökümü benim için garip.

Bir satırda birkaç tam bellek dökümünü ele geçirdik. Bazılarında COM tutkal yığınları var gibi görünüyor.

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] 

Kitaptaki tek semboller bizim kodundan olduklarını yardımcı olmuyor: Örneğin, birkaç dökümü dosyaları böyle bir çağrı yığını göstermektedir. Microsoft sembol sunucusu msvbm60.dll (veya en azından 6.0.98.2 olan sürümlerinden) için bir PDB dosyasına sahip değil.

Sorular

Ben sadece kendi sistemi üzerinde oluyor bazı COM iş parçacığı sorunu olabilir şüphelenen.

1) Nasıl bir dökümü dosyasındaki her dişin diş durumunu belirleyebilir? Bu bir yönetilen döküm dosyası olsaydı, iş parçacığı durumlarını anlamak için !threads ve !threadstate'a bakardım. Yönetilen kod yoktur, bu yüzden sos.dll kullanamıyorum. ~ ve !teb kullanarak herhangi bir ipucu görmedim.

2) bir dökümü dosyasında oluşturulan hangi COM nesneleri görmek için bir yolu var mı? Yine, yönetilen bir dökümde, yönetilen nesnelerin bir listesini almak için !dumpheap yapabilirim. COM nesneleri için bulabileceğim benzer bir şey var mı?

3) Döküm dosyasındaki COM nesnelerinin diş çekme modelini belirleyebilir miyim?

+0

Tüm VB6 sizin mi yoksa üçüncü taraf COM nesnelerini mi çağırıyorsunuz? – tcarvin

+0

Bildiğim kadarıyla, tüm VB6 COM nesneleri bizimdir. –

+0

Ardından, VB6'nın çok iş parçacığı desteklemediğine göre, iş parçacıklarının görüntülenmesini çok fazla istemiyorum. En yakın olanı, çoklu yalıtılmış STA'ları (tek dişli daireler) destekleyen ActiveX sunucularındandır. – tcarvin

cevap

1

Sadece soruları cevaplayabiliyorum 1. İşlemi gerçekleştiren iş parçacığı veya iş parçacıklarını bulmak için !runaway kullanın. Tüm iplik yığınlarını almak için ~*kb1000 kullanın.

+0

Konu durumu bilgisini de görmek istiyorum. İş parçacığı durumu "arka plan" veya "çalışan" veya "sonlandırıldı". –

2

Sen komutunu kullanarak iplik durumuna dökümü:

~* 

bu bir devlet olarak 'arka plan' göstermez, sadece dondurulmuş veya askıya çalışan görürsünüz.

COM nesnelerine ait bilgileri nasıl alabildiğinden emin değilim, hiç denemedim, ancak araştırma yapacağım ve size geri döneceğimiz için, uygulama modeliyle ilgili olarak, adım atıldıktan sonra uygulama durumunun ağrılı bir şekilde izlenmesi olmadan çıkması zor olacaktır. aracılığıyla ve hatta, tüm diğer iş parçacığı üzerinden adım zaman tüm iş parçacığı geçerli olanı eşitleyen .bpsync 1 kullanmadığınız sürece çalışır, ancak asmak neden olabilir (örneğin gui iş parçacığı şimdi donma anlatıldı) Kaynak koduna erişiminiz olmadıkça zor olun.