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 consolaMirar 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.