¿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
Respuesta
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.
creo una especie de marco de registro ayudaría a hacer eso ...
Salida:
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?
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
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
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ó!)
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. –
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.
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.
- 1. Imprimiendo todas las variables y valores definidos
- 2. C# función reutilizable para volcar el valor actual de las variables locales
- 3. Determine el sistema operativo durante el tiempo de ejecución
- 4. Volcar todas las propiedades definidas en el script Ant
- 5. en php ¿hay alguna manera de volcar "todas" las variables con su valor correspondiente?
- 6. valores de columna acumulativos de las fechas actuales y anteriores
- 7. PHP: Cómo volcar todas las variables locales en un manejador de excepciones
- 8. Cómo bloquear la orientación durante el tiempo de ejecución
- 9. variables de sintonización de mysql - actuales y predeterminadas
- 10. ¿Cambia los valores enum en el tiempo de ejecución?
- 11. Imprimir todas las variables de entorno en C/C++
- 12. XNA Change Game Service dinámicamente durante el tiempo de ejecución
- 13. acceso todas las variables locales
- 14. Visualización de todas las variables definidas
- 15. Obtener todas las variables env en C \ C++ en Windows
- 16. Imprimir todas las variables globales/variables locales?
- 17. Crear una clase durante el tiempo de ejecución
- 18. Resalte elementos en WebDriver durante el tiempo de ejecución
- 19. volcar todas las tablas de mysql en archivos separados automágicamente?
- 20. Android buscar recurso por id durante el tiempo de ejecución
- 21. ¿Cuál es la mejor manera de unir dos objetos durante el tiempo de ejecución usando C#?
- 22. ¿Obtener todas las variables de Javascript?
- 23. Obtener todas las propiedades con los valores de reflexión
- 24. ¿Cuáles son los valores de tiempo ms actuales para las constantes animTime de Android?
- 25. C++ apilar las variables y variables montón
- 26. Constantes y variables de tiempo de compilación
- 27. Java ¿cómo imprimir todas las variables locales?
- 28. C# Las variables estáticas - alcance y persistencia
- 29. ORA-01008 con todas las variables obligado
- 30. comando mysql para mostrar las variables de configuración actuales
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). –
"autodetección"? –
No, quise decir 'super' porque sería superior a lo que actualmente tenemos con C#. –