La depuración remota en VB6
-
21-08-2019 - |
Pregunta
Es posible depurar de forma remota un proceso iniciado VB6 exterior?
La aplicación es una aplicación de VB6 con bastantes recursos DLL / OCX. Estoy intentando configurar una implementación de ClickOnce, mediante COM-Alta gratis, de la aplicación de VB6, pero he estado recibiendo errores cuando se ejecuta.
Mi comprensión de la forma en que VB6 redirige registerations COM probablemente quiere decir que esto no es posible, pero pensé que alguien podría tener una mejor idea.
Solución
Creo que al depurar en Visual Basic 6, no se adhieren a un binario corriendo pero en vez interpreta el código dentro de su propio proceso. Esta es la razón por la API de Win32 administrador de tareas y muestran VB6.exe como la aplicación en ejecución durante la depuración.
Además, como se dice, a veces VB6 cortocircuitos llama a bibliotecas COM de modo que interceptan estas llamadas no siempre es posible.
Usted está probablemente va a tener que recurrir a la tala inteligente (es decir, registrar los valores de las variables en torno a los puntos en los que los errores que está recibiendo ocurren con la esperanza de localizar la línea de código que se produce en, y / o el estado de variables relevantes.)
Buena suerte
Otros consejos
Para apoyar la respuesta de Darryl sugiriendo WinDbg - aquí hay un 2006 entrada en el blog por un tipo sobre el uso de Microsoft WinDbg con VB6 y 2004 entrada de blog por otro Microsoft tipo con una breve introducción a WinDbg.
EDIT: Sólo para que quede totalmente claro. Windbg es un depurador independiente libre de Microsoft. Compilar su EXEs VB6, DLL y OCX en código nativo con símbolos (crear archivos PDB) y usted será capaz de depurar la aplicación ClickOnce.
extracto clave en el blog:
Si usted tiene acceso limitado a la máquina servidor, puede utilizar la instalaciones de depuración remota de WinDbg. Adjuntar una copia de WinDBG a la proceso de la manera habitual y luego convertirlo en un servidor de depuración (Echa un vistazo a .server en la ayuda en WinDbg). A continuación, puede conectarse a él remota desde el menú Archivo de WinDbg. Será como estar allí excepto por la falta de ruido de los ventiladores de la sala de servidores. Cuando la depuración de un mando a distancia, su copia de WinDbg es sólo un terminal muy elegante por lo que todas las extensiones, los símbolos y así sucesivamente tienen que estar en el servidor remoto. Esta opción se configura de la misma manera para cualquier DLL, Visual Basic 6 o .NET.
Los símbolos de su componente no se carga hasta que su componente hace y lo que tiene que permitir que el servidor al menos ese tiempo. Puedes poner una ruptura en principio de su código de VB si usted quiere parar el depurador en ese punto, pero si lo hace, recuerde que se detendrá allí cada vez a través del código. Vamos a suponer que se deja correr y luego entrar. Si la lista de los símbolos cargados para su módulo con "x MyModule! *" a continuación, verá todas sus funciones, junto con una gran cantidad de símbolos liado allí para usted. VB agrega interfaces y símbolos bastante sin vergüenza, pero que por lo general no tiene que preocuparse por ellos. Uno Lo que probablemente se verá extraño es que toda la sintaxis de clase / método con la convención de colon doble de C ++ en lugar de la pequeña amigable punto. WinDbg no entiende que VB es diferente y es tratado al igual que cualquier DLL con símbolos.
A partir de aquí, se puede establecer puntos de interrupción en la forma habitual (pb etc) y la etapa a través de código. También puede abrir los módulos de código fuente de VB y conjunto puntos de interrupción en ellas con F9 aunque las extensiones de archivos no están en VB la fuente de tipo de archivo desplegable. Recorrer el código está revelando pero podría ser un poco alarmante si no se ha visto que el código VB genera para usted antes. Se le paso a paso por el ensamblador y hay una gran cantidad de sustancia viscosa COM allí. HResults se comprueban mucho. Es probable que necesite para hacer referencia a la fuente de frecuencia para calcular dónde usted es ya que se necesita un poco de práctica para ser capaz de saber lo que el código fuente parecía. Las variantes son especialmente difícil porque VB hace mucho trabajo para usted allí y lo que parece ser un simple ecuación puede dar lugar a una gran cantidad de código. El código optimizado es aún más difícil debido a que la orden de ejecución es a menudo muy diferente de lo que se podría esperar y es más difícil de lo habitual para ver los datos.
Los datos no es fácil de conseguir en esta forma. Cuando nos fijamos en las variables locales (Dv es la orden), entonces usted puede ver que las variables son simplemente enumeran como eclipsó lo que significa que la memoria está siendo utilizado para algo más también en el curso de la vida o la función que el nombre no es único en este contexto. Enumeraciones solo muestran como enteros o largos y objetos muestran como punteros. De hecho, ellos siempre eran exactamente eso, pero el IDE de VB que se esconde de usted. cadenas VB son COM BSTR (y en consecuencia Unicode) bajo las sábanas y las matrices de bytesson realmente Char matrices. Puede que se sorprenda al descubrir que las cadenas VB son Unicode como VB parece no tener soporte para cualquier cosa menos ANSI. Es decir debido a que el motor de forma Rubí fue sólo ANSI. El tiempo de ejecución convierte la cadenas Unicode a ANSI para Ruby y API llamadas aunque hay maneras para pasar Unicode si lo desea.
No vas a ser capaz de obtener en el Err, aplicación u objetos de impresora ya que tendría que pasar por un montón de interior y completamente estructuras indocumentados a llegar a ellos. Incluso si se pudiera llegar hasta allí, que serían sólo los datos en bruto sin las funciones de acceso que utilizar en VB. Si usted tiene que mirar a cualquiera de esos campos, la mejor opción es incorporarlos depurar el código en el código fuente para copiar sus valores a en alguna parte que se puede conseguir en.
Se puede intervenir al tiempo de ejecución de VB si quieres, pero probablemente no será muy revelador si usted está tratando de depurar la aplicación. Si lo haces, notará que internos de VB están influenciados muy COM. los influencia era en realidad dos vías ya algunas ideas COM vinieron de VB originalmente.
Es posible que vea las excepciones cuando se ejecuta el código. referencia nula excepciones (es decir, eliminación de referencias a un puntero nulo) no son poco comunes o nada de qué preocuparse. Ellos se muestran como primera oportunidad C000005 excepciones con una dirección de 0 o casi 0. El tiempo de ejecución a veces hacer que si hay objetos fijados a nada más que lo que es seguro porque la únicos valores posibles son nulo o un valor válido. También verá excepciones si su código hace búsquedas en colecciones y el valor es no ahí. Porque las excepciones son ahora tan caro, es probable que desee para evitar hacer que si se puede. Otra excepción que se quiere comúnmente ver es c000008f. Si se mira el número hasta entonces encontrará que es un punto flotante excepción resultado inexacto. Se utiliza en una diferente significado aquí - ya que no generamos real en coma flotante excepciones resultados inexactos, que con seguridad se pueden tirar para indicar VB errores del tipo que puede atraparse normales.
Depuración de caidas o bloqueos en los componentes de VB se hace mucho en el misma manera que con cualquier otro componente no administrado, pero es sólo un poco más difícil a causa de las compilaciones descritos anteriormente. Si usted tiene que tratar depuración de código VB esta manera, no te recomiendo que comience en una aplicación "Hola mundo" y su forma de trabajo. Todas las cosas que puede VB un lenguaje fácil de codificar en que sea un terrible lenguaje para depuración.
¿Ha tratado windbg ? Sólo asegúrese de que tiene los archivos PDB para el proyecto.