win open files dmp carpeta archivo analizar c# .net crash-dumps

c# - files - open dump file windows 10



Generar volcados de bloqueo.NET automáticamente (7)

Sé cómo generar archivos Crash Dump con ADPlus o DebugDiag, pero me pregunto si hay una forma de hacerlo en la computadora de un cliente sin instalar estas herramientas ... específicamente, me gustaría poder configurar mi aplicación ( utilizando un valor de registro, por ejemplo) para generar un volcado de emergencia en el caso de una falla crítica. Más específicamente, necesito poder hacer esto desde una aplicación C #, pero no me importa P / Invokeing si es necesario. ¡Gracias!


¿Utiliza un marco de registro como log4net? Normalmente desactiva los mensajes de nivel de depuración para una versión. Sin embargo, puede pensar en escribir un appender especial que se conecta a un archivo solo en ciertos casos (como un bloqueo). Este appender escribe al principio en un ringbuffer solo de memoria que puede escribirse en un archivo, más tarde, desencadenado, por ejemplo, por un manejador de excepciones como lo sugiere 280Z28.


Creo que si tu aplicación tiene una manguera, entonces también puedes intentar crear un mini archivo de volcado. ¿Qué es lo peor que va a pasar? ¿Tu aplicación se bloqueará? Lo está haciendo de todos modos, así que mejor prueba.
El código en el foro de MSDN mencionado por VoiDed parece bastante sólido. Necesitaba una versión VB.Net así que aquí hay una versión VB para cualquiera que la necesite:

Friend Class MiniDump ''Code converted from C# code found here: http://social.msdn.microsoft.com/Forums/en-US/clr/thread/6c8d3529-a493-49b9-93d7-07a3a2d715dc Private Enum MINIDUMP_TYPE MiniDumpNormal = 0 MiniDumpWithDataSegs = 1 MiniDumpWithFullMemory = 2 MiniDumpWithHandleData = 4 MiniDumpFilterMemory = 8 MiniDumpScanMemory = 10 MiniDumpWithUnloadedModules = 20 MiniDumpWithIndirectlyReferencedMemory = 40 MiniDumpFilterModulePaths = 80 MiniDumpWithProcessThreadData = 100 MiniDumpWithPrivateReadWriteMemory = 200 MiniDumpWithoutOptionalData = 400 MiniDumpWithFullMemoryInfo = 800 MiniDumpWithThreadInfo = 1000 MiniDumpWithCodeSegs = 2000 End Enum <Runtime.InteropServices.DllImport("dbghelp.dll")> _ Private Shared Function MiniDumpWriteDump( _ ByVal hProcess As IntPtr, _ ByVal ProcessId As Int32, _ ByVal hFile As IntPtr, _ ByVal DumpType As MINIDUMP_TYPE, _ ByVal ExceptionParam As IntPtr, _ ByVal UserStreamParam As IntPtr, _ ByVal CallackParam As IntPtr) As Boolean End Function Friend Shared Sub MiniDumpToFile(ByVal fileToDump As String) Dim fsToDump As IO.FileStream = Nothing If (IO.File.Exists(fileToDump)) Then fsToDump = IO.File.Open(fileToDump, IO.FileMode.Append) Else fsToDump = IO.File.Create(fileToDump) End If Dim thisProcess As Process = Process.GetCurrentProcess() MiniDumpWriteDump(thisProcess.Handle, _ thisProcess.Id, _ fsToDump.SafeFileHandle.DangerousGetHandle(), _ MINIDUMP_TYPE.MiniDumpNormal, _ IntPtr.Zero, _ IntPtr.Zero, _ IntPtr.Zero) fsToDump.Close() End Sub End Class

Solo asegúrate de que la recepción sólida maneje las llamadas y deberías estar relativamente seguro.


Dependiendo del tipo de información que necesita, ¿podría agregar un controlador para el evento AppDomain.UnhandledException ? (Sé que no es exactamente lo que estás buscando, pero definitivamente está disponible en las máquinas cliente).


Podría P / Invocar la función MiniDumpWriteDump en el evento AppDomain.UnhandledException .

En este caso, podría volcar un registro de los datos de excepción .NET y escribir un minivolcado en el archivo.

También hay un hilo en los foros de MSDN que describe la firma de P / Invoke y el uso correcto.


Puede configurar Windows Error Reporting (WER) para crear un volcado de emergencia en un directorio específico utilizando el siguiente script de registro:

Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/Windows Error Reporting/LocalDumps] "DumpFolder"="C://Dumps" "DumpCount"=dword:00000064 "DumpType"=dword:00000002 "CustomDumpFlags"=dword:00000000

El volcado irá a C: / Dumps con un nombre que refleje el nombre del proceso que se colgó. DumpType = 2 da un vuelco total de memoria. DumpType = 1 da un mini volcado. En máquinas de 64 bits, no necesita colocarlas debajo de los nodos Wow32. WER solo utiliza la clave de registro no WOW especificada anteriormente.

Dependiendo del tipo de falla, este método puede no funcionar. Todavía tengo que descubrir por qué o qué tipos de colisiones no capta. ¿Nadie?


Puede llamar a Environment.FailFast , que:

El método FailFast escribe la cadena del mensaje en el registro de eventos de la aplicación Windows, crea un volcado de su aplicación y luego finaliza el proceso actual. La cadena del mensaje también se incluye en el informe de errores a Microsoft.

Entre otras cosas.


Tenga en cuenta que la creación de un minivolcado desde el interior del proceso "fallido" (o incluso el hilo) en sí no es trivial o puede no ser preciso (también las MiniDumpWriteDump función MiniDumpWriteDump ).

Además, si su proceso es tan molesto que podría necesitar escribir un volcado de emergencia, la situación general suele ser tan inestable, que incluso intentar crear un volcado de emergencia podría causar otra caída (situaciones como las de un lado, pero podrían ser incluso más difícil de "atrapar" desde el proceso actual).

Lo "mejor" que puede hacer, si no puede instalar aplicaciones separadas en los sistemas de su cliente, es iniciar un proceso externo (que también puede fallar en situaciones críticas) y dejar que cree un crashdump a partir de su proceso actual (consulte Superassert. NET de John Robbins ). Incluso podría llegar tan lejos como para poner el binario externo en los recursos de su aplicación, extraerlo desde allí al inicio (para minimizar la falla en situaciones críticas) en el disco (si se atreve).