2012-03-01 12 views
13

Una vez más estoy escribiendo un visualizador de depurador externo, y estoy corriendo hacia una pared. Parece que hay un límite en el tamaño de la cadena que puede devolver el visualizador del depurador.¿Cómo puedo aumentar el tamaño de la cadena que puede visualizar un visualizador de depurador externo?

El visualizador de depurador TStrings que se envió con Delphi 2010 tenía un límite de 4 K. En una respuesta a una pregunta publicada en los grupos de noticias de Embarcadero, Ewe Schuster replied que "Puedes aumentar el buffer un poco, pero AFAIR la limitación real está en IOTAThread. Evaluar con un límite de 12k caracteres".

Mi visualizador de depurador se basa en el código del visualizador del depurador TStrings, y puedo ver que la implementación del método Evaluar TFrame incluye la siguiente declaración de ResultStr, que se utiliza para devolver la cadena devuelta desde el IOTAThread.Evaluate llamar:

ResultStr: array[0..4095] of Char; 

Tenía la esperanza de que el aumento del tamaño de este búfer ayudaría, pero no tuve suerte.

¿Qué puedo hacer, si acaso, para aumentar el tamaño de la cadena que puede visualizar mi visualizador de depurador externo?

+2

Como solución, ¿puede crear un visualizador para PString? – gabr

Respuesta

11

Tenía la misma paciencia limitada para ese límite ... Así que hice un visualizador de depuración que soluciona la limitación sobre todo al crear un MemoryStream en el proceso depurado para contener el resultado de la expresión, luego usar algo como

CurProcess.ReadProcessMemory(StrToInt(SrcMemoryAddr), DstMemStream.Size, DstMemStream.Memory^); 

para copiarlo en un MemoryStream de un visualizador. Luego puede hacer lo que quiera para mostrarlo (por ejemplo formatearlo para lectura humana si se trata de una cadena XML como CLientDataSet.XMLData).

Hay algunos trucos dependiendo si la expresión es una cadena constante, una var, o necesita una evaluación, etc ...

Mi FGStringVisualizer no es 100% satisfactoria, por lo que no he publicado aún en el mi blog, pero como hace el 99% de lo que necesito, no me tomé el tiempo para limpiarlo un poco y publicarlo incluso "tal cual". Pero si hay una necesidad, ciertamente puedo hacerlo con todos los descargos de responsabilidad necesarios ...

Actualización: Es la misma idea que utilicé para mi FGStringListVisualizer que presenté en el último DelphiLive. Por cierto, este también podría valer la pena ponerlo en mi blog ya que hice algunas mejoras desde entonces.

+1

Fantástico. Muchas gracias. Sin embargo, no entiendo completamente la respuesta. Uso CurProcess para obtener CurrentThread, y luego llamo Evaluate en CurrentThread para obtener el valor de la expresión (que es una cadena en mi caso). ¿Cómo funciona el código que proporcionó trabajar en esta ecuación? Es su variable ScrMemoryAddr el parámetro Out Resultdr de Evaluar. y el DstMemStream TMemoryStream de su visualizador? –

+0

Llamo 'Evaluate' para Crear el MemoryStream en CurProcess:' if not Evaluate (DebugSvcs, CurProcess, CurThread, 'NativeInt (TMemoryStream.Create)', SrcMemStreamAddr) then'. Luego uso 'Evaluate' nuevamente para poner la cadena en él:' if not Evaluate (DebugSvcs, CurProcess, CurThread, 'TMemoryStream (' + SrcMemStreamAddr + ') .Write ((' + FExpression + '), Length (' + FExpression + ') * SizeOf (Char))', CurSizeResult) then' ... Ahí es donde se vuelve turbio dependiendo de la naturaleza de Expression ... –

+1

Disculpe mi ignorancia, pero no puedo encontrar un método de evaluación que tome una IOTADebuggerServices, IOTAProcess e IOTAThread como sus primeros tres parámetros. Es este un método personalizado que escribiste De lo contrario, ¿en qué interfaz encontraré esta versión de Evaluar? –

Cuestiones relacionadas