suficiente - ¿Es posible recuperar la pila de llamadas mediante programación en VB6?
out of stack space (5)
Estoy bastante seguro de que tienes que hacerlo de la manera difícil. En un trabajo previo mío, tuvimos un proceso de manejo de errores muy elegante para VB6 con componentes DCOM. Sin embargo, fue necesario agregar un código redundante a cada método, tanto que teníamos herramientas propias para insertarlo todo para usted.
No puedo proporcionarle demasiada información sobre su implementación (tanto porque me olvidé de la mayoría como por la posibilidad de que lo consideren un secreto comercial). Una cosa que se destaca es que el nombre del método no se pudo derivar en tiempo de ejecución, por lo que se agregó como una variable de cadena (algunos desarrolladores copiarían y pegarían en lugar de usar la herramienta y generarían errores que mintieron. ..).
HTH
Cuando se produce un error en una función, me gustaría saber la secuencia de eventos que conducen a ella, especialmente cuando se llama a esa función desde una docena de lugares diferentes. ¿Hay alguna manera de recuperar la pila de llamadas en VB6, o tengo que hacerlo de la manera difícil (por ejemplo, entradas de registro en cada función y controlador de errores, etc.)?
Tienes que hacerlo de la manera difícil, pero en realidad no es tan difícil ... En serio, una vez que hayas escrito la plantilla una vez, se trata de una copia / pegado / modificación rápida para que coincida con el nombre de la función en la declaración Err.Raise al nombre de la función real.
Private Function DoSomething(ByVal Arg as String)
On Error GoTo Handler
Dim ThisVar as String
Dim ThatVar as Long
'' Code here to implement DoSomething...
Exit Function
Handler:
Err.Raise Err.Number, , "MiscFunctions.DoSomething: " & Err.Description
End Function
Cuando tiene llamadas anidadas, esto se desenrolla a medida que cada rutina golpea su Manejador y agrega su nombre a la descripción del error. En la función de nivel superior, obtienes una "pila de llamadas" que muestra la lista de rutinas que fueron llamadas, y el número de error y la descripción del error que realmente ocurrió. No es perfecto, ya que no obtienes números de línea, pero he descubierto que generalmente no los necesitas para encontrar el camino al problema. (Y si realmente quiere números de línea, puede ponerlos en la función y hacer referencia a ellos en la instrucción Err.Raise utilizando la variable Erl. Sin números de línea, eso solo devuelve 0.)
Además, tenga en cuenta que dentro de la función en sí, puede plantear sus propios errores con los valores de las variables interesantes en el mensaje como sigue:
Err.Raise PCLOADLETTER_ERRNUM, , "PC Load Letter error on Printer """ & PrinterName & """"
(El resaltado de sintaxis parece poco claro en la vista previa ... Me pregunto cómo se verá cuando se publique?)
Como dijeron otras personas (hace años, veo ... ¡pero hay tantas personas que todavía usan VB6! :)), creo que no es posible recuperar la Pila de llamadas mediante programación, a menos que use alguna herramienta de terceros.
Pero si necesita hacer eso para fines de depuración, puede considerar añadir a la rutina llamada una variable de cadena de entrada opcional, donde pondría el nombre de la persona que llama.
Sub MyRoutine
(...) '' Your code here
call DoSomething (Var1, Var2, Var3, "MyRoutine")
'' ^
'' Present routine''s name -----------+
(...) '' Your code here
End Sub
Public DoSomething (DoVar1, DoVar2, DoVar3, Optional Caller as string = "[unknown]")
Debug.Print " DoSomething Routine Called. Caller = " & Caller
... '' (your code here)
End Sub
No tan elegante, tal vez, pero funcionó para mí.
Saludos, Max - Italia
Compuware (o era Numega en ese momento) DevStudio para Visual Basic 6 solía hacer esto. El camino estaba añadiendo agregar instrumentación a cada llamada que llamara un fragmento muy pequeño que se agregó a la pila de códigos. En cualquier error, descartó esa pila de llamadas y luego hizo cosas como enviar por correo o publicar en un servidor web toda la información de depuración. Agregar y quitar la instrumentación era una operación potencialmente letal (especialmente en aquel entonces, cuando usábamos VSS como nuestro control de origen), pero si funcionaba, funcionaba bien.
Como señaló Darrel , podría agregar algo muy similar usando MZTools y configurando una plantilla. Trabaja mucho, y probablemente sea más eficaz de lo que sería la recompensa, pero si tiene dificultades para localizar errores, podría ser útil).
La forma dura y manual es prácticamente la única manera. Si revisa esta pregunta, alguien sugirió una herramienta llamada MZTools que hará mucho del trabajo duro para usted.