示例#1
0
        protected unsafe bool ReadStream <T>(MINIDUMP_STREAM_TYPE streamToRead, out T streamData)
        {
            IntPtr streamPointer;
            uint   streamSize;

            return(ReadStream <T>(streamToRead, out streamData, out streamPointer, out streamSize));
        }
示例#2
0
        public static bool MiniDumpReadDumpStream(IntPtr pBase, MINIDUMP_STREAM_TYPE type, out IntPtr streamPointer, out uint cbStreamSize)
        {
            MINIDUMP_HEADER header = (MINIDUMP_HEADER)Marshal.PtrToStructure(pBase, typeof(MINIDUMP_HEADER));

            streamPointer = IntPtr.Zero;
            cbStreamSize  = 0;

            // todo: throw dump format exception here:
            if (header.Singature != MINIDUMP_SIGNATURE || (header.Version & 0xffff) != MINIDUMP_VERSION)
            {
                return(false);
            }

            int  sizeOfDirectory = Marshal.SizeOf(typeof(MINIDUMP_DIRECTORY));
            long dirs            = pBase.ToInt64() + (int)header.StreamDirectoryRva;

            for (int i = 0; i < (int)header.NumberOfStreams; ++i)
            {
                MINIDUMP_DIRECTORY dir = (MINIDUMP_DIRECTORY)Marshal.PtrToStructure(new IntPtr(dirs + i * sizeOfDirectory), typeof(MINIDUMP_DIRECTORY));
                if (dir.StreamType != type)
                {
                    continue;
                }

                streamPointer = new IntPtr(pBase.ToInt64() + (int)dir.Rva);
                cbStreamSize  = dir.DataSize;
                return(true);
            }

            return(false);
        }
示例#3
0
        /// <summary>
        /// Get a DumpPointer for the given stream. That can then be used to further decode the stream.
        /// </summary>
        /// <param name="type">type of stream to lookup</param>
        /// <returns>DumpPointer refering into the stream. </returns>
        private DumpPointer GetStream(MINIDUMP_STREAM_TYPE type)
        {
            if (!TryGetStream(type, out DumpPointer stream))
            {
                throw new ClrDiagnosticsException("Dump does not contain a " + type + " stream.", ClrDiagnosticsExceptionKind.CrashDumpError);
            }

            return(stream);
        }
示例#4
0
 internal MINIDUMP_THREAD_LIST(DumpPointer streamPointer, MINIDUMP_STREAM_TYPE streamType)
     : base(streamPointer, streamType)
 {
     if (streamType != MINIDUMP_STREAM_TYPE.ThreadListStream &&
         streamType != MINIDUMP_STREAM_TYPE.ThreadExListStream)
     {
         throw new ClrDiagnosticsException("Only ThreadListStream and ThreadExListStream are supported.", ClrDiagnosticsExceptionKind.CrashDumpError);
     }
 }
示例#5
0
        protected MinidumpArray(DumpPointer streamPointer, MINIDUMP_STREAM_TYPE streamType)
        {
            if (streamType != MINIDUMP_STREAM_TYPE.ModuleListStream &&
                streamType != MINIDUMP_STREAM_TYPE.ThreadListStream &&
                streamType != MINIDUMP_STREAM_TYPE.ThreadExListStream)
            {
                throw new ClrDiagnosticsException("MinidumpArray does not support this stream type.", ClrDiagnosticsExceptionKind.CrashDumpError);
            }

            _streamPointer = streamPointer;
        }
示例#6
0
        protected unsafe bool ReadStream <T>(MINIDUMP_STREAM_TYPE streamToRead, out T streamData, out IntPtr streamPointer, out uint streamSize)
        {
            streamData = default(T);

            if (ReadStream(streamToRead, out streamPointer, out streamSize))
            {
                streamData = (T)Marshal.PtrToStructure(streamPointer, typeof(T));

                return(true);
            }

            return(false);
        }
示例#7
0
        /// <summary>
        /// Get a DumpPointer for the given stream. That can then be used to further decode the stream.
        /// </summary>
        /// <param name="type">type of stream to lookup</param>
        /// <param name="stream">DumpPointer refering into the stream. </param>
        /// <returns>True if stream was succesfully retrived</returns>
        private bool TryGetStream(MINIDUMP_STREAM_TYPE type, out DumpPointer stream)
        {
            EnsureValid();

            bool fOk = DumpNative.MiniDumpReadDumpStream(_view.BaseAddress, type, out IntPtr pStream, out uint cbStreamSize);

            if (!fOk || IntPtr.Zero == pStream || cbStreamSize < 1)
            {
                stream = default;
                return(false);
            }

            stream = DumpPointer.DangerousMakeDumpPointer(pStream, cbStreamSize);
            return(true);
        }
示例#8
0
        protected unsafe bool ReadStream <T>(MINIDUMP_STREAM_TYPE streamToRead, out T streamData, out IntPtr streamPointer, out uint streamSize)
        {
            MINIDUMP_DIRECTORY directory = new MINIDUMP_DIRECTORY();

            streamData    = default(T);
            streamPointer = IntPtr.Zero;
            streamSize    = 0;

            try
            {
                byte *baseOfView = null;
                _mappedFileView.AcquirePointer(ref baseOfView);

                if (baseOfView == null)
                {
                    throw new Exception("Unable to aquire pointer to memory mapped view");
                }

                if (!NativeMethods.MiniDumpReadDumpStream((IntPtr)baseOfView, streamToRead, ref directory, ref streamPointer, ref streamSize))
                {
                    int lastError = Marshal.GetLastWin32Error();

                    if (lastError == DbgHelpErrors.ERR_ELEMENT_NOT_FOUND)
                    {
                        return(false);
                    }
                    else
                    {
                        throw new Win32Exception(lastError);
                    }
                }

                streamData = (T)Marshal.PtrToStructure(streamPointer, typeof(T));
            }
            finally
            {
                _mappedFileView.ReleasePointer();
            }

            return(true);
        }
示例#9
0
        public MINIDUMP_DIRECTORY ReadStreamType(MINIDUMP_STREAM_TYPE strmType)
        {
            MINIDUMP_DIRECTORY dir = new MINIDUMP_DIRECTORY();
            var initloc            = new MINIDUMP_LOCATION_DESCRIPTOR()
            {
                Rva      = 0,
                DataSize = AllocationGranularity
            };

            if (MapStream(initloc) == IntPtr.Zero)
            {
                throw new InvalidOperationException("MapViewOfFileFailed");
            }
            var dirPtr = IntPtr.Zero;

            dir.location = initloc;
            var _strmPtr  = IntPtr.Zero;
            var _strmSize = 0u;

            if (MiniDumpReadDumpStream(
                    _addrFileMapping,
                    strmType,
                    ref dirPtr,
                    ref _strmPtr,
                    ref _strmSize
                    ))
            {
                dir = Marshal.PtrToStructure <MINIDUMP_DIRECTORY>(dirPtr);
            }
            else
            {
                dir.streamType        = strmType;
                dir.location.Rva      = 0;
                dir.location.DataSize = 0;
            }
            return(dir);
        }
示例#10
0
        public MinidumpMemoryChunks(DumpPointer rawStream, MINIDUMP_STREAM_TYPE type)
        {
            Count         = 0;
            _memory64List = null;
            _memoryList   = null;
            _listType     = MINIDUMP_STREAM_TYPE.UnusedStream;

            if (type != MINIDUMP_STREAM_TYPE.MemoryListStream &&
                type != MINIDUMP_STREAM_TYPE.Memory64ListStream)
            {
                throw new ClrDiagnosticsException("Type must be either MemoryListStream or Memory64ListStream", ClrDiagnosticsExceptionKind.CrashDumpError);
            }

            _listType   = type;
            _dumpStream = rawStream;
            if (MINIDUMP_STREAM_TYPE.Memory64ListStream == type)
            {
                InitFromMemory64List();
            }
            else
            {
                InitFromMemoryList();
            }
        }
 private static extern bool MiniDumpReadDumpStream(
     IntPtr BaseOfDump,
     MINIDUMP_STREAM_TYPE StreamNumber,
     ref MINIDUMP_DIRECTORY Dir,
     ref IntPtr StreamPointer,
     ref uint StreamSize);
 private static extern bool MiniDumpReadDumpStream(
     IntPtr BaseOfDump,
     MINIDUMP_STREAM_TYPE StreamNumber,
     ref MINIDUMP_DIRECTORY Dir,
     ref IntPtr StreamPointer,
     ref uint StreamSize);
示例#13
0
文件: DbghelpApi.cs 项目: sgww/cozy
 public static extern bool MiniDumpReadDumpStream(
     IntPtr BaseOfDump,
     MINIDUMP_STREAM_TYPE StreamNumber,
     ref IntPtr DirPtr,
     ref IntPtr StreamPointer,
     ref uint StreamSize);