delphi stack-trace callstack madexcept jedi-code-library

delphi - Necesita una forma de registrar periódicamente el seguimiento de la pila/pila de llamadas para CADA método/procedimiento/función llamada



stack-trace callstack (5)

Estoy trabajando en una aplicación muy grande en la que periódicamente deseo registrar la pila de llamadas COMPLETA hasta el punto de ejecución actual (no en una excepción). La idea aquí es que quiero un mapa de la ruta exacta del código que me llevó al punto en que estoy. He estado trabajando con locura. Excepto, equipado con jclDebug y aunque puedo obtener algo de la pila de llamadas, parece que no puedo obtener CADA método / procedimiento / llamada de función que se realiza en la aplicación para aparecer en el registro.

Tengo habilitados los marcos de pila, la información de depuración, etc. en el proyecto. Incluso traté de activar los marcos de pila en métodos individuales que no se incluían en la pila de llamadas en vano.

¿Es lo que estoy tratando de hacer posible? Estoy tratando de evitar tener que agregar código de registro en todos nuestros millones de líneas de código para poder registrar la ruta del código.


Desde las respuestas y comentarios hasta otras respuestas, parece que necesita un REGISTRO DE LLAMADAS, no un LLAMADO DE LLAMADAS. La información que desea simplemente no está presente en una pila de llamadas.

En ese caso, le sugiero que investigue una herramienta como SmartInspect o AQ Time . De los dos, creo que SmartInspect tiene más probabilidades de ser relevante. AQ Time es más una herramienta de creación de perfiles interactivos, ya que SmartInspect posee instalaciones específicamente para la inspección remota.


Puede usar madExcept : incluye un método llamado GetThreadStackTrace . MadExcept es gratuito para uso no comercial y definitivamente vale la pena el precio.


Si se trata de un seguimiento completo que desea, creo que una herramienta como SmartInspect podría llevarlo muy lejos.

Exigiría agregar el registro a su código, pero para lo que necesita, eso sería inevitable.

Algunos de sus aspectos más destacados

Monitor en tiempo real
Registro en vivo de alto rendimiento a través de TCP o conductos con nombre en la consola

Mirar y monitorear recursos
Seguimiento de valores variables, datos de sesión y otros recursos de la aplicación.

Rich Logging & Tracing
Rastrea mensajes, excepciones, objetos, archivos, resultados de bases de datos y más.


Cuando regresas de un método, se elimina de la pila. Entonces, ¿presumiblemente su pila de llamadas parciales es cada método que aún no ha regresado?

p.ej

DoSomething begin MiniSubMethod DomeSomethingMore begin InnerDoSomething begin ShowCallStack end end end

Creo que en esta situación la pila de llamadas sería

InnerDoSomething DoSomethingMore DoSomething

MiniSubMethod ya no está en la pila como lo devolvió antes de llamar a DoSomethingMore.

Creo que FastMM4 incluye un Stack Trace para que puedas probar eso.

Definitivamente necesitarías algún tipo de seguimiento de registro / pila en lugar de solo la pila de llamadas.


Yo uso JCLDebug desde el JCL para hacer justamente esto.

Lo siguiente obtendrá la pila de llamadas para la ubicación actual y la devolverá como una cadena.

function GetCurrentStack: string; var stackList: TJclStackInfoList; //JclDebug.pas sl: TStringList; begin stackList := JclCreateStackList(False, 0, Caller(0, False)); sl := TStringList.Create; stackList.AddToStrings(sl, True, True, True, True); Result := sl.Text; sl.Free; stacklist.Free; end;

Para que esto funcione como se espera, debe habilitar una de las formas admitidas para la información de depuración para JCL, como por ejemplo:

  • Información de Turbo Debugger
  • Archivos JDBG (generados a partir de los archivos MAP)
  • Archivos JBDG insertados en el EXE.

Recientemente cambié entre los archivos JDBG insertados en el EXE para simplemente enviar los archivos JDBG externos, ya que era más fácil de mantener.

También hay rutinas que son útiles para el seguimiento tales como:

function ProcByLevel(Level : Integer) : String;

Esto le permite determinar el nombre del método / procedimiento actual mirando hacia atrás en la cantidad de niveles "N" de la pila de llamadas.