AntecedentesCómo inspeccionar objetos COM del archivo volcado de Visual Basic?
Tenemos una aplicación .NET WinForms escrito en C# que se conecta a un escáner de mano tienda a través de una aplicación de consola. La aplicación de consola está escrita en un buen 'VB6-- no hay código administrado allí. La aplicación VB6 consiste en varios objetos COM.
La aplicación .NET WinForms actualiza los datos en el escáner invocando la aplicación de la consola con los parámetros correctos. Cuando se inicia la aplicación de la consola, aparece un formulario modal que recuerda al usuario que coloque el dispositivo portátil en su base.
Problema
un cliente tiene una extraña situación en la que la llamada para iniciar la aplicación de consola parece que se bloquea antes de mostrar el formulario recordar. Si el usuario presiona cualquier tecla, incluso algo inocente como Shift o Alt, la aplicación se desactiva y aparece el formulario de recordatorio. Mientras está colgado, el uso de CPU de la aplicación de consola es muy alto.
Hemos obtenido un volcado de memoria desde la aplicación de línea de comandos usando ProcDump. Tengo cierta experiencia en depurar archivos de volcado administrados, pero este volcado de VB 6 es extraño para mí.
Capturamos varios volcados de memoria completos en una fila. En algunos de ellos, parece haber pilas de pegamento COM. Por ejemplo, varios archivos de volcado muestran una pila de llamadas de esta manera:
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]
No ayuda que los únicos símbolos que tengo son de nuestro código. El servidor de símbolos de Microsoft no tiene un archivo PDB para msvbm60.dll (o al menos no de su versión que es 6.0.98.2).
Preguntas
Estoy sospechando que puede haber algún problema roscado COM que está sucediendo sólo en su sistema.
1) ¿Cómo puedo determinar el estado del hilo de cada hilo en un archivo de volcado? Si se tratara de un archivo de volcado administrado, miraría !threads
y luego !threadstate
para descubrir los estados del subproceso. No hay código administrado, por lo que no puedo usar sos.dll. No vi ninguna pista usando ~
y !teb
.
2) ¿Hay alguna manera de ver qué objetos COM se han creado en un archivo de volcado? De nuevo, en un volcado administrado, puedo hacer un !dumpheap
para obtener una lista de objetos administrados. ¿Hay algo similar que pueda encontrar para los objetos COM?
3) ¿Puedo determinar el modelo de subprocesamiento de objetos COM en el archivo de volcado?
¿Son todos los VB6 suyos, o también está llamando a objetos COM de terceros? – tcarvin
Hasta donde yo sé, todos los objetos VB6 COM son nuestros. –
Entonces creo que ver los subprocesos no van a crecer mucho dado que VB6 no es compatible con multithreading. Lo más cerca que se encuentra es en servidores ActiveX que admiten varias STA aisladas (apartamentos de subproceso único). – tcarvin