private string GetMinidumpPath(BacktraceData backtraceData, string dataPrefix) { if (_settings.MinidumpType == MiniDumpType.None) { return(string.Empty); } //note that every minidump file generated by app ends with .dmp extension //its important information if you want to clear minidump file string minidumpDestinationPath = Path.Combine(_settings.DatabasePath, string.Format("{0}-dump.dmp", dataPrefix)); var backtraceReport = backtraceData.Report; if (backtraceReport == null) { return(string.Empty); } MinidumpException minidumpExceptionType = backtraceReport.ExceptionTypeReport ? MinidumpException.Present : MinidumpException.None; bool minidumpSaved = MinidumpHelper.Write( filePath: minidumpDestinationPath, options: _settings.MinidumpType, exceptionType: minidumpExceptionType); return(minidumpSaved ? minidumpDestinationPath : string.Empty); }
/// <summary> /// Create instance of MiniDumpExceptionInformation /// </summary> /// <param name="exceptionInfo">Type to check if exception exists</param> /// <returns>New instance of MiniDumpExceptionInformation</returns> internal static MiniDumpExceptionInformation GetInstance(MinidumpException exceptionInfo) { MiniDumpExceptionInformation exp; exp.ThreadId = SystemHelper.GetCurrentThreadId(); exp.ClientPointers = false; exp.ExceptionPointers = IntPtr.Zero; // right now Unity environment doesn't support // GetExceptionPointers // because of that we cannot pass exception pointer to minidump write method //right now GetExceptionPointers method is not available in .NET Standard //#if !NET_STANDARD_2_0 // try // { // if (exceptionInfo == MinidumpException.Present) // { // exp.ExceptionPointers = GetExceptionPointers(); // } // } // catch (Exception e) // { //#if DEBUG // UnityEngine.Debug.Log(string.Format("Cannot add exception information to minidump file. Reason: {0}", e)); //#endif // ///Operation not supported; // } //#endif return(exp); }
/// <summary> /// Create instance of MiniDumpExceptionInformation /// </summary> /// <param name="exceptionInfo">Type to check if exception exists</param> /// <returns>New instance of MiniDumpExceptionInformation</returns> internal static MiniDumpExceptionInformation GetInstance(MinidumpException exceptionInfo) { MiniDumpExceptionInformation exp; exp.ThreadId = SystemHelper.GetCurrentThreadId(); exp.ClientPointers = false; exp.ExceptionPointers = IntPtr.Zero; return(exp); }
/// <summary> /// Create instance of MiniDumpExceptionInformation /// </summary> /// <param name="exceptionInfo">Type to check if exception exists</param> /// <returns>New instance of MiniDumpExceptionInformation</returns> internal static MiniDumpExceptionInformation GetInstance(MinidumpException exceptionInfo) { MiniDumpExceptionInformation exp; exp.ThreadId = SystemHelper.GetCurrentThreadId(); exp.ClientPointers = false; exp.ExceptionPointers = IntPtr.Zero; //right now GetExceptionPointers method is not available in .NET Standard #if !NETSTANDARD2_0 if (exceptionInfo == MinidumpException.Present) { exp.ExceptionPointers = Marshal.GetExceptionPointers(); } #endif return(exp); }
/// <summary> /// Create new minidump file in database directory path. Minidump file name is a random Guid /// </summary> /// <param name="backtraceReport">Current report</param> /// <param name="miniDumpType">Generated minidump type</param> /// <returns>Path to minidump file</returns> private string GenerateMiniDump(BacktraceReport backtraceReport, MiniDumpType miniDumpType) { //note that every minidump file generated by app ends with .dmp extension //its important information if you want to clear minidump file string minidumpDestinationPath = Path.Combine(DatabaseSettings.DatabasePath, $"{backtraceReport.Uuid}-dump.dmp"); MinidumpException minidumpExceptionType = backtraceReport.ExceptionTypeReport ? MinidumpException.Present : MinidumpException.None; bool minidumpSaved = MinidumpHelper.Write( filePath: minidumpDestinationPath, options: miniDumpType, exceptionType: minidumpExceptionType); return(minidumpSaved ? minidumpDestinationPath : string.Empty); }
/// <summary> /// Create new minidump file in database directory path. Minidump file name is a random Guid /// </summary> /// <param name="backtraceReport">Current report</param> /// <param name="miniDumpType">Generated minidump type</param> /// <returns>Path to minidump file</returns> internal virtual string GenerateMiniDump(BacktraceReport backtraceReport, MiniDumpType miniDumpType) { if (miniDumpType == MiniDumpType.None) { return(string.Empty); } //note that every minidump file generated by app ends with .dmp extension //its important information if you want to clear minidump file string minidumpDestinationPath = Path.Combine(_path, string.Format("{0}-dump.dmp", backtraceReport.Uuid)); MinidumpException minidumpExceptionType = backtraceReport.ExceptionTypeReport ? MinidumpException.Present : MinidumpException.None; bool minidumpSaved = MinidumpHelper.Write( filePath: minidumpDestinationPath, options: miniDumpType, exceptionType: minidumpExceptionType); return(minidumpSaved ? minidumpDestinationPath : string.Empty); }
/// <summary> /// Create new minidump file in database directory path. Minidump file name is a random Guid /// </summary> /// <param name="backtraceReport">Current report</param> /// <param name="miniDumpType">Generated minidump type</param> /// <returns>Path to minidump file</returns> public string GenerateMiniDump(BacktraceReportBase <T> backtraceReport, MiniDumpType miniDumpType) { if (!_enable) { return(string.Empty); } //note that every minidump file generated by app ends with .dmp extension //its important information if you want to clear minidump file string minidumpDestinationPath = Path.Combine(_directoryPath, $"{Guid.NewGuid()}.dmp"); MinidumpException minidumpExceptionType = backtraceReport.ExceptionTypeReport ? MinidumpException.Present : MinidumpException.None; bool minidumpSaved = MinidumpHelper.Write( filePath: minidumpDestinationPath, options: miniDumpType, exceptionType: minidumpExceptionType); if (minidumpSaved) { return(minidumpDestinationPath); } return(string.Empty); }
/// <summary> /// Save memory dump on disk /// </summary> /// <param name="filePath">The path where the minidump file will be saved</param> /// <param name="options">Minidump save options</param> /// <param name="exceptionType">Type to check if exception exists</param> internal static bool Write(string filePath, MiniDumpType options = MiniDumpType.WithFullMemory, MinidumpException exceptionType = MinidumpException.None) { bool miniDumpAvailable = IsMemoryDumpAvailable(); if (!miniDumpAvailable) { return(false); } Process currentProcess = Process.GetCurrentProcess(); IntPtr currentProcessHandle = currentProcess.Handle; uint currentProcessId = (uint)currentProcess.Id; var exceptionInformation = MiniDumpExceptionInformation.GetInstance(exceptionType); using (FileStream fileHandle = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite, FileShare.Write)) { return(exceptionInformation.ExceptionPointers == IntPtr.Zero ? MiniDumpWriteDump(currentProcessHandle, currentProcessId, fileHandle.SafeFileHandle, (uint)options, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero) : MiniDumpWriteDump(currentProcessHandle, currentProcessId, fileHandle.SafeFileHandle, (uint)options, ref exceptionInformation, IntPtr.Zero, IntPtr.Zero)); } }