Esempio n. 1
0
        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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 8
0
        /// <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));
            }
        }