PointerInfo IDumpDataReader.Read(CancellationToken token, IProgress <int> prog) { var sw = new System.Diagnostics.Stopwatch(); sw.Start(); PointerInfo pointerInfo = new PointerInfo(); const int readMaxSize = 4096; ReadIndicate(); //foreach (NoexsDumpIndex x in indices) for (int index = 0; index < indices.Count; index++) { NoexsDumpIndex x = indices[index]; if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } if (!IsMainHeapAddress(x.address)) { continue; } fileStream.BaseStream.Seek(x.pos, SeekOrigin.Begin); MemoryType type = GetMemoryType(x.address); long startAddress = GetStartAddress(type); long address = x.address - startAddress; long rem = x.size; while (rem > 0) { if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } int readSize = readMaxSize; if (rem < readSize) { readSize = (int)rem; } rem -= readSize; byte[] buff = fileStream.ReadBytes(readSize); //pickup pointer from heap int loopcnt = readSize / 8; for (int i = 0; i < loopcnt; i++) { long tmp_data = BitConverter.ToInt64(buff, i << 3); if (IsHeapAddress(tmp_data)) { Address from = new Address(type, address); Address to = new Address(MemoryType.HEAP, tmp_data - heapStartAddress); pointerInfo.AddPointer(from, to); } address += 8; } } prog.Report((int)(100 * (index + 1) / indices.Count)); } pointerInfo.MakeList(); sw.Stop(); TimeSpan ts = sw.Elapsed; //3.28.24 return(pointerInfo); }