2009-10-12 25 views
20

¿Existen bibliotecas incorporadas o de terceros que le permitan simplemente volcar todas las variables en la memoria durante el tiempo de ejecución? Lo que me gustaría es poder ver las variables & valores actuales de forma similar a verlos al tocar un punto de interrupción y pasar el puntero sobre las variables, pero sin tener que detener la ejecución del programa (es decir, obtener una instantánea). Sería bueno si pudiera volcarlos en un archivo que luego se puede abrir más tarde en un programa para obtener una buena interfaz GUI para verlos, pero el simple volcado de archivos de texto sería lo suficientemente bueno.C# Cómo volcar todas las variables y valores actuales durante el tiempo de ejecución

+0

Creo que esta pregunta es muy genérica, y formaría parte de un "superdetector" si existiera una respuesta, por lo que he abierto una recompensa por ello. Imagínese si la lista de variables fue filtrable sobre la marcha, y también dio el uso de la memoria (se puede soñar). –

+0

"autodetección"? –

+1

No, quise decir 'super' porque sería superior a lo que actualmente tenemos con C#. –

Respuesta

7

No se me ocurre una manera fácil de hacerlo de forma genérica. Lo que podría funcionar es crear programáticamente un archivo de volcado de su proceso en ejecución. Puede hacer esto con P/Invoke a las rutinas dbghelp.dll o generar un proceso cdb.exe para crear el archivo de volcado. Una vez que tenga el archivo, puede abrirlo en un depurador para su posterior análisis usando SOS.dll with cdb.exe/windbg.exe, o incluso escribir un debugger script para volcar los datos que desea (sobre todo) automáticamente.

4

creo una especie de marco de registro ayudaría a hacer eso ...

Salida:

http://www.dotnetlogging.com/

En mi lugar de trabajo que utilizan log4net que funciona bastante bien para nosotros.

Entonces, ¿cómo es que quiere deshacerse de todas las variables para un análisis posterior? ¿Ha considerado escribir su prueba de código primero para que pueda reducir su dependencia del depurador y tener un conjunto de pruebas automatizadas que comprueben los valores para usted?

+0

Sí, ya uso el registro similar a log4net. Sin embargo, quería más un volcado variable genérico para no tener que escribir código específico para volcar variables a un registrador para cada programa. También sería bueno tener un visor de GUI de una instantánea para que las estructuras de clase complejas sean fáciles de leer. – mike

+0

Quiero descargar las variables para la tranquilidad, básicamente. Tengo confianza en el programa, pero solo quiero confirmar que todo va bien. Es extremadamente difícil escribir pruebas exhaustivas para la naturaleza del trabajo que estoy haciendo, e incluso entonces solo puedes escribir pruebas para las situaciones que se te ocurran. También podría formarse como una forma de bajo nivel para ver en qué estado se encuentra el programa en cualquier momento. – mike

1

En el pasado utilicé el perfilador .Net YourKit para perfilar aplicaciones .Net.

Si bien solo lo he usado alguna vez para conectarme personalmente con las aplicaciones en ejecución, el Snapshot documentation indica que tienen un Profiler API que se puede usar para volcar las instantáneas mediante programación para su posterior revisión.

Código sabia esto parece ser tan simple como la siguiente:

Controller c = new Controller(); 
String snapshotPath = c.CaptureSnapshot(); 

Creo que a continuación, puede cargar los archivos de instantáneas en la interfaz gráfica de usuario YourKit en una fecha posterior para revisarlos.

No me sorprendería que algunos de los otros perfiladores populares como JetBrains dotTrace Performance y Redgates ANTS Performance Profiler tienen API programáticas similares pero no pude encontrar rápidamente la documentación obvia en sus sitios web (y que no quería ver a sus seminarios en línea para ¡averigüe si esta característica existió!)

+1

Quizás deberías mencionar que YourKit cuesta dinero. WMemoryProfiler es gratuito y de código abierto. También he encontrado en las páginas web de perfiles profesionales, excepto Yourkit no programatic memory snapshot Api. Los otros solo tienen Apis para instantáneas de perfiladores de rendimiento. Si esta característica existiera, estoy seguro de que la comercialización la habría puesto en su página web. –

0

Puede probar Intellitrace herramienta provista con la última versión de visual studio. Es lo que describes: registra lo que está sucediendo en tu aplicación y te permite depurarlo sin ejecutar tu programa al pasar el ratón sobre las variables y todas las demás ventanas de depuración para ayudarte.

0

Puede usar PostSharp. Me resultó muy útil registrar los tiempos de depuración debido a la implementación de la aplicación de entorno. Y instrumentado/grabado muchas cosas.

Pero obviamente tendrá que especificar todas las variables que necesita registrar.

Más detalles here.

1

Para ello se puede utilizar WMemoryProfiler a

  • Obtener todos los objetos en todos los dominios de aplicación como una matriz de objetos
  • Crear un volcado de memoria de su propio proceso de
  • serializar objetos específicos en un disco

Para que esto suceda, necesita Windbg, por supuesto, pero el Api de WMemoryProfiler está completamente administrado y básicamente puede auto-depurar su proceso. La biblioteca se ocupa de las rarezas habituales del depurador, ya que envuelve Windbg en una biblioteca accesible y agradable.

El código siguiente obtiene todas las instancias de System.Threading.Thread objects en una matriz de objetos. De esta forma, puede escribir un visualizador para sus propios objetos de aplicación en tiempo de ejecución. La otra sobrecarga simplemente le da todos los objetos en todos los AppDomains.

using (var debugger = new MdbEng()) 
{ 
    var dummy = new Thread(() => {}); 
    dummy.Name = "Dummy Thread"; 

    // Get all thread objects in all AppDomains 
    var threads = debugger.GetObjects("System.Threading.Thread", true); 

    foreach (Thread t in threads) 
    { 
    Console.WriteLine("Managed thread {0} has Name {1}", t.ManagedThreadId, t.Name); 
    } 
    GC.KeepAlive(dummy); 
} 

Dado que es una envoltura alrededor de WinDbg también puede crear un volcado de memoria sobre la marcha y después cargar un volcado de memoria del proceso para extraer datos de objeto para la visualización del vertedero. Los Perfiladores de Memoria Commerical (por ejemplo, MemoryProfiler de Scitech) emplean esta técnica desde hace años, pero es bastante lenta cuando tienes un volcado de memoria enorme, ya que también usan Windbg como analizador de volcado.

Cuestiones relacionadas