Je sais comment générer des fichiers Crash Dump avec ADPlus ou DebugDiag, mais je me demande s’il existe un moyen de le faire sur l’ordinateur d’un client sans installer ces outils ... en particulier, j'aimerais pouvoir configurer mon application ( en utilisant une valeur de registre, par exemple) pour générer un vidage sur incident en cas de défaillance critique. Plus précisément, je dois pouvoir le faire à partir d'une application C #, mais je ne crains pas P / Invoke'ing si nécessaire. Merci!
Réponses
Trop de publicités?Notez que la création d'un minidump de l'intérieur de la "défaut" de processus (ou même thread) lui-même n'est pas trivial, ou peuvent ne pas être exacts (également MiniDumpWriteDump fonction des Remarques).
En outre, si votre processus est dans une telle colère que vous pourriez avoir besoin d'écrire un fichier de vidage sur incident, la situation est généralement tellement arrosé, que même en essayant de créer un fichier de vidage sur incident pourrait provoquer un krach (telles situations se bloque de côté - mais celles-ci pourraient être encore plus difficile à "attraper" dans le processus en cours).
La meilleure chose que vous pouvez faire, si vous ne pouvez pas installer d'applications distinctes sur vos systèmes du client, est de commencer un processus externe (qui peut également échouer dans les situations critiques!) et la laisser créer un crashdump de votre processus actuel (voir Superassert.NET de John Robbins). Vous pouvez même aller aussi loin, pour mettre en externe binaire dans vos ressources de l'application, l'extraire de là au démarrage (comme pour minimiser l'échec critique de vos milieux de vie) sur le disque (si vous osez).
Vous pouvez configurer Windows Error Reporting (WER) pour créer un fichier de vidage sur incident dans un répertoire spécifique, en utilisant le script de registre suivantes:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\rapport d'Erreurs Windows\LocalDumps] "DumpFolder"="C:\\Dumps" "DumpCount"=dword:00000064 "DumpType"=dword:00000002 "CustomDumpFlags"=dword:00000000
Le dump aller dans C:\Dumps avec un nom qui reflète le nom du processus qui s'est écrasé. DumpType=2 donne une image mémoire complète. DumpType=1 donne un mini-dump. Sur 64 bits machines, vous n'avez pas besoin de mettre celles-ci sous la Wow32 nœuds. WER n'utilise que les non-WOW clé de registre spécifié ci-dessus.
Selon le type d'accident, cette méthode peut ne pas fonctionner. Je n'ai pas encore de comprendre pourquoi ou qui crash types il ne l'attrape pas. N'importe qui?
Je pense que si votre application est modifié, alors vous pourriez aussi bien prendre un coup à la création d'un mini fichier de vidage, quel est le pire qui va arriver, votre application se bloque? C'est en faisant que de toute façon, de sorte que vous pourriez aussi bien essayer.
Le code dans le forum MSDN mentionné par Annulés semble assez solide. J'avais besoin d'un VB.Net version voici donc une version de visual basic pour tous ceux qui en ont besoin:
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
Assurez-vous solidement eception gérer les appels et vous devriez être relativement à l'abri.
Je suggère de lire le post suivant qui m’a vraiment aidé à mettre en œuvre des dumbs automatiques et explique également comment les utiliser:
http://voneinem-windbg.blogspot.com/2007/03/creating-and-analyzing-minidumps-in-net.html