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?
Tüm VB6 sizin mi yoksa üçüncü taraf COM nesnelerini mi çağırıyorsunuz? – tcarvin
Bildiğim kadarıyla, tüm VB6 COM nesneleri bizimdir. –
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