2012-05-16 28 views
5

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?

+0

¿Son todos los VB6 suyos, o también está llamando a objetos COM de terceros? – tcarvin

+0

Hasta donde yo sé, todos los objetos VB6 COM son nuestros. –

+0

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

Respuesta

1

Solo puedo responder a la pregunta 1. Use !runaway para encontrar el hilo o hilos que consumen la CPU. Para obtener todas las pilas de hilos, use ~*kb1000.

+0

Me gustaría ver información sobre el estado del hilo también. El estado del subproceso se encuentra en "fondo" o "en ejecución" o "terminado". –

2

se puede volcar el estado de rosca con el comando:

~* 

esto no mostrará 'fondo' como un estado, sólo verá correr, congelado o suspendido.

No estoy seguro de cómo puede obtener información de los objetos COM, nunca he intentado pero investigaré y me pondré en contacto con usted respecto al modelo de subprocesamiento será difícil inferirlo sin un monitoreo doloroso del estado de la aplicación después de avanzar a través e incluso con eso, cuando pases por todos los otros hilos se ejecutará a menos que uses .bpsync 1 que sincroniza todos los hilos con el actual, pero eso podría causar un bloqueo (por ejemplo, se ha dicho que el hilo gui se congele) así que creo que ser difícil a menos que tenga acceso al código fuente.

Cuestiones relacionadas