Esempio n. 1
0
        public DeltaTreeBuilder(TraceReplayStateful t, double startTime, double endTime, TraceReplayStateful.StatusDelegate status_delegate, TreePerspective perspective, Options options)
            : base(t, status_delegate, perspective, options)
        {
            m_StartTime = startTime;

            Replay.SeekTo(endTime, StatusCallback);
        }
Esempio n. 2
0
        internal SymbolResolveDialog(TraceListItem trace, Options options)
        {
            InitializeComponent();

            m_Options = options;
            m_Item    = trace;
            m_Replay  = new TraceReplayStateful(trace.FileName);
        }
Esempio n. 3
0
    internal SymbolResolveDialog(TraceListItem trace, Options options)
    {
      InitializeComponent();

      m_Options = options;
      m_Item = trace;
      m_Replay = new TraceReplayStateful(trace.FileName);

    }
Esempio n. 4
0
    internal DeltaWindow(string fn, Options options)
    {
      InitializeComponent();

      m_Trace = new TraceReplayStateful(fn);
      m_Options = options;

      TimeControlHelpers.CreateTimeControlMarks(m_StartTimeControl, m_Trace);
      TimeControlHelpers.CreateTimeControlMarks(m_EndTimeControl, m_Trace);

      m_Perspective.Items.AddRange(TreePerspective.AllItems);
      m_Perspective.SelectedIndex = 0;
    }
Esempio n. 5
0
        internal DeltaWindow(string fn, Options options)
        {
            InitializeComponent();

            m_Trace   = new TraceReplayStateful(fn);
            m_Options = options;

            TimeControlHelpers.CreateTimeControlMarks(m_StartTimeControl, m_Trace);
            TimeControlHelpers.CreateTimeControlMarks(m_EndTimeControl, m_Trace);

            m_Perspective.Items.AddRange(TreePerspective.AllItems);
            m_Perspective.SelectedIndex = 0;
        }
Esempio n. 6
0
        internal HeapWindow(TraceListItem trace_info, Options options)
        {
            m_Options = options;
            m_Trace   = new TraceReplayStateful(trace_info.FileName);

            InitializeComponent();

            InitTree();

            InitFragmentationView();

            // Set window title.
            Text = String.Format("{0} ({2} - {1:n0} events) - MemTrace Heap View", Path.GetFileName(m_Trace.FileName), m_Trace.MetaData.EventCount, m_Trace.MetaData.PlatformName);
        }
Esempio n. 7
0
        private void ScanTraceDirectory()
        {
            HashSet <string> paths = new HashSet <string>();

            for (int i = 0; i < m_TraceItems.Count;)
            {
                var item = m_TraceItems[i];
                if (item.Status == TraceStatus.Ready && !Path.Equals(Path.GetDirectoryName(item.FileName), m_Options.TraceDirectory))
                {
                    m_TraceItems.RemoveAt(i);
                }
                else
                {
                    paths.Add(item.FileName.ToLowerInvariant());
                    ++i;
                }
            }

            foreach (var fn in Directory.GetFiles(m_Options.TraceDirectory, "*.mtrace", SearchOption.TopDirectoryOnly))
            {
                if (paths.Contains(fn.ToLowerInvariant()))
                {
                    continue; // Skip files being recorded already
                }
                try
                {
                    using (var replay = new TraceReplayStateful(fn))
                    {
                        var item = new TraceListItem(fn, replay.MetaData, null);
                        m_TraceItems.Add(item);
                    }
                }
                catch (Exception ex)
                {
                    if (DialogResult.Yes == MessageBox.Show(this, "Failed to open " + fn + "\n\n" + ex.Message + "\n\nDelete it?", "Error", MessageBoxButtons.YesNo))
                    {
                        try
                        {
                            File.Delete(fn);
                        }
                        catch (IOException)
                        {
                        }
                    }
                }
            }

            m_TraceList.SetObjects(m_TraceItems);
            m_TraceFileLabel.Text = "Trace Files in " + m_Options.TraceDirectory;
        }
Esempio n. 8
0
    internal HeapWindow(TraceListItem trace_info, Options options)
    {
      m_Options = options;
      m_Trace = new TraceReplayStateful(trace_info.FileName);

      InitializeComponent();

      InitTree();

      InitFragmentationView();

      // Set window title.
      Text = String.Format("{0} ({2} - {1:n0} events) - MemTrace Heap View", Path.GetFileName(m_Trace.FileName), m_Trace.MetaData.EventCount, m_Trace.MetaData.PlatformName);
    }
Esempio n. 9
0
 protected TreeBuilderBase(TraceReplayStateful replay, TraceReplayStateful.StatusDelegate status_delegate, TreePerspective perspective, Options options)
 {
     Replay            = replay;
     StatusCallback    = status_delegate;
     Perspective       = perspective;
     Root              = new MemTreeNode(null, "Everything");
     SuppressedSymbols = new HashSet <string>();
     if (options.EnableSuppression)
     {
         foreach (var sym in options.SuppressedSymbols)
         {
             SuppressedSymbols.Add(sym);
         }
     }
 }
Esempio n. 10
0
 protected TreeBuilderBase(TraceReplayStateful replay, TraceReplayStateful.StatusDelegate status_delegate, TreePerspective perspective, Options options)
 {
   Replay = replay;
   StatusCallback = status_delegate;
   Perspective = perspective;
   Root = new MemTreeNode(null, "Everything");
   SuppressedSymbols = new HashSet<string>();
   if (options.EnableSuppression)
   {
     foreach (var sym in options.SuppressedSymbols)
     {
       SuppressedSymbols.Add(sym);
     }
   }
 }
Esempio n. 11
0
    private ISymbolResolver CreateResolver(TraceReplayStateful m_Replay)
    {
      var platformName = m_Replay.MetaData.PlatformName;
      switch (platformName)
      {
        case "Windows":
        case "Durango":
          return new DbgHelpSymbolResolver();

        case "Orbis":
          return new OrbisSymbolResolver();

        default:
          return null;
      }
    }
Esempio n. 12
0
        private ISymbolResolver CreateResolver(TraceReplayStateful m_Replay)
        {
            var platformName = m_Replay.MetaData.PlatformName;

            switch (platformName)
            {
            case "Windows":
            case "Durango":
                return(new DbgHelpSymbolResolver());

            case "Orbis":
                return(new OrbisSymbolResolver());

            default:
                return(null);
            }
        }
Esempio n. 13
0
    private static ulong GetElfBaseAddress(ISymbolProgressListener listener, TraceReplayStateful replay, string elfFile, string sdkDir)
    {
      ulong wellKnownAddress = 0;

      listener.UpdateMessage("Finding symbol MemTrace::InitCommon in the ELF..");

      var procInfo = new ProcessStartInfo
      {
        Arguments = String.Format("\"{0}\"", elfFile),
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden,
        CreateNoWindow = true,
        FileName = Path.Combine(sdkDir, @"host_tools\bin\orbis-nm.exe"),
        RedirectStandardOutput = true
      };

      using (var nm = Process.Start(procInfo))
      {
        for (; ; )
        {
          string line = nm.StandardOutput.ReadLine();

          if (null == line)
            break;

          if (line.EndsWith(s_MangledWellKnownSymbol))
          {
            wellKnownAddress = UInt64.Parse(line.Split()[0], NumberStyles.HexNumber);
            nm.Kill();
          }
        }
      }

      listener.UpdateMessage("MemTrace::InitCommon at ELF address 0x{0:x16}, runtime 0x{1:x16}", wellKnownAddress, replay.MetaData.MemTraceInitCommonAddress);

      ulong baseAddress = replay.MetaData.MemTraceInitCommonAddress - wellKnownAddress;
      listener.UpdateMessage("ELF base address set to 0x{0:x16}", baseAddress);

      return baseAddress;
    }
Esempio n. 14
0
    public void BeginResolve(string exePath, ISymbolProgressListener listener, TraceReplayStateful replay, ICollection<string> symbolPaths, ICollection<ModulePathRemapping> remappings)
    {
      Task.Run(() =>
      {
        try
        {
          string sdkDir = Environment.GetEnvironmentVariable("SCE_ORBIS_SDK_DIR");

          if (null == sdkDir)
            throw new ApplicationException("Environment variable SCE_ORBIS_SDK_DIR not set");

          // Figure out the base address of the ELF
          ulong baseAddress = GetElfBaseAddress(listener, replay, exePath, sdkDir);

          ResolveSymbols(listener, replay, exePath, sdkDir, baseAddress);

          listener.Done();
        }
        catch (Exception ex)
        {
          listener.UpdateError(ex.Message);
        }
      });
    }
Esempio n. 15
0
    private void ResolveSymbols(ISymbolProgressListener listener, TraceReplayStateful replay, string elfFile, string sdkDir, ulong elfBase)
    {
      var result = new Dictionary<ulong, SymbolInfo>();

      var procInfo = new ProcessStartInfo
      {
        // Need to merge stdout and stderr together
        Arguments = String.Format("--infile=\"{0}\" -a2l", elfFile),
        UseShellExecute = false,
        WindowStyle = ProcessWindowStyle.Hidden,
        CreateNoWindow = true,
        FileName = Path.Combine(sdkDir, @"host_tools\bin\orbis-bin.exe"),
        RedirectStandardInput = true,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
      };

      var stdout = new List<string>();

      using (var proc = Process.Start(procInfo))
      {
        proc.OutputDataReceived += (object sender, DataReceivedEventArgs args) =>
        {
          if (!String.IsNullOrEmpty(args.Data) && !args.Data.StartsWith("WARNING:"))
            stdout.Add(args.Data);
        };

        proc.ErrorDataReceived += (object sender, DataReceivedEventArgs args) =>
        {
          // Throw it on the floor.
        };

        proc.BeginOutputReadLine();
        proc.BeginErrorReadLine();

        int x = 0;
        var lastUpdate = DateTime.Now; 
        var updateThres = new TimeSpan(0, 0, 0, 0, 100);

        foreach (ulong address in replay.MetaData.Symbols)
        {
          if (x % 100 == 0 || DateTime.Now - lastUpdate > updateThres)
          {
            listener.UpdateProgress(String.Format("Resolving symbol {0}/{1}..", x + 1, replay.MetaData.Symbols.Count), (x + 1) / (double)replay.MetaData.Symbols.Count);
            lastUpdate = DateTime.Now; 
          }

          if (address != 0)
          {
            proc.StandardInput.WriteLine("0x{0:x16}", address - elfBase);
          }

          ++x;
        }

        proc.StandardInput.Close();
        proc.WaitForExit();
      }

      // Now deal with orbis-bin's wonky output format
      for (int k = 0; k < stdout.Count; )
      {
        var addrStr = MatchPrefix(stdout[k++], "Address:");
        ulong addr = UInt64.Parse(addrStr.Substring(2), NumberStyles.HexNumber);
        string directory = MatchPrefix(stdout[k++], "Directory:").Replace('/', Path.DirectorySeparatorChar);
        string filename = MatchPrefix(stdout[k++], "File Name:");

        var sym = new SymbolInfo();

        sym.Address = addr + elfBase;
        if (filename != "??")
          sym.FileName = Path.Combine(directory, filename);
        else
          sym.FileName = "Unknown";
        sym.LineNumber = Int32.Parse(MatchPrefix(stdout[k++], "Line Number:"));
        sym.Symbol = MatchPrefix(stdout[k++], "Symbol:");

        // Try to discard function signature data.
        int firstParenPos = sym.Symbol.IndexOf('(');
        if (-1 != firstParenPos)
        {
          sym.Symbol = sym.Symbol.Substring(0, firstParenPos);
        }

        result[addr + elfBase] = sym;
      }

      listener.UpdateProgress("Saving..", 1.0);
      listener.UpdateMessage("Writing resolved symbols back to trace file");

      replay.UpdateResolvedSymbols(result);

      listener.UpdateProgress("Done", 1.0);
      listener.UpdateMessage("Finished!");

    }
Esempio n. 16
0
    public DeltaTreeBuilder(TraceReplayStateful t, double startTime, double endTime, TraceReplayStateful.StatusDelegate status_delegate, TreePerspective perspective, Options options)
      : base(t, status_delegate, perspective, options)
    {
      m_StartTime = startTime;

      Replay.SeekTo(endTime, StatusCallback);
    }
Esempio n. 17
0
 public SnapshotTreeBuilder(TraceReplayStateful t, double time, TraceReplayStateful.StatusDelegate status_delegate, TreePerspective perspective, Options options)
   : base(t, status_delegate, perspective, options)
 {
   Replay.SeekTo(time, StatusCallback);
 }
Esempio n. 18
0
    private void ScanTraceDirectory()
    {
      HashSet<string> paths = new HashSet<string>();

      for (int i = 0; i < m_TraceItems.Count; )
      {
        var item = m_TraceItems[i];
        if (item.Status == TraceStatus.Ready && !Path.Equals(Path.GetDirectoryName(item.FileName), m_Options.TraceDirectory))
        {
          m_TraceItems.RemoveAt(i);
        }
        else
        {
          paths.Add(item.FileName.ToLowerInvariant());
          ++i;
        }
      }

      foreach (var fn in Directory.GetFiles(m_Options.TraceDirectory, "*.mtrace", SearchOption.TopDirectoryOnly))
      {
        if (paths.Contains(fn.ToLowerInvariant()))
          continue; // Skip files being recorded already

        try
        {
          using (var replay = new TraceReplayStateful(fn))
          {
            var item = new TraceListItem(fn, replay.MetaData, null);
            m_TraceItems.Add(item);
          }
        }
        catch (Exception ex)
        {
          if (DialogResult.Yes == MessageBox.Show(this, "Failed to open " + fn + "\n\n" + ex.Message + "\n\nDelete it?", "Error", MessageBoxButtons.YesNo))
          {
            try
            {
              File.Delete(fn);
            }
            catch (IOException)
            {
            }
          }
        }

      }

      m_TraceList.SetObjects(m_TraceItems);
      m_TraceFileLabel.Text = "Trace Files in " + m_Options.TraceDirectory;
    }
Esempio n. 19
0
    public void BeginResolve(string ignored, ISymbolProgressListener listener, TraceReplayStateful replay, ICollection<string> symbolPaths, ICollection<ModulePathRemapping> remappings)
    {
      Task.Run(() =>
      {
        var result = new Dictionary<ulong, SymbolInfo>();
        var metadata = replay.MetaData;
        var platform = metadata.PlatformName;

        using (var dbghelp = new DbgHelp(symbolPaths))
        {
          for (int i = 0, count = metadata.Modules.Count; i < count; ++i)
          {
            var mod = metadata.Modules[i];

            listener.UpdateProgress(String.Format("Loading module {0}/{1}..", i + 1, count), (i + 1) / (double)count);

            // TEMP! Ignore empty module from Durango.
            if (mod.Name == "")
              continue;

            var fn = mod.Name;
            foreach (var rm in remappings)
            {
              if (0 != StringComparer.InvariantCultureIgnoreCase.Compare(rm.Platform, platform))
                continue;

              if (fn.ToLower().StartsWith(rm.Path.ToLower()))
              {
                var oldfn = fn;
                fn = rm.ReplacementPath + fn.Substring(rm.Path.Length);
                listener.UpdateMessage(String.Format("Remapped {0} -> {1}", oldfn, fn));
              }
            }

            listener.UpdateMessage(String.Format("Loading {0} at {1:x16}, size={2:n0} bytes", fn, mod.BaseAddress, mod.SizeBytes));
            dbghelp.LoadModule(fn, mod.BaseAddress, mod.SizeBytes);
          }

          int x = 0;
          foreach (ulong address in metadata.Symbols)
          {
            if (x % 100 == 0)
            {
              listener.UpdateProgress(String.Format("Resolving symbol {0}/{1}..", x + 1, metadata.Symbols.Count), (x + 1) / (double)metadata.Symbols.Count);
            }

            SymbolInfo sym;
            if (dbghelp.LookupSymbol(address, out sym))
            {
              result[address] = sym;
            }
            else
            {
              sym.Symbol = "(unknown)";
              foreach (var mod in metadata.Modules)
              {
                if (address >= mod.BaseAddress && address <= mod.BaseAddress + mod.SizeBytes)
                {
                  sym.Symbol = String.Format("{0}!0x{1:x16}", Path.GetFileNameWithoutExtension(mod.Name), address);
                  result[address] = sym;
                  break;
                }
              }
              //UpdateMessage(String.Format("Failed to resolve address {0:x}\n", address));
            }

            ++x;
          }
        }

        listener.UpdateProgress("Saving..", 1.0);
        listener.UpdateMessage("Writing resolved symbols back to trace file");

        replay.UpdateResolvedSymbols(result);

        listener.UpdateProgress("Done", 1.0);
        listener.UpdateMessage("Finished!");

        listener.Done();
      });
    }
Esempio n. 20
0
 public SnapshotTreeBuilder(TraceReplayStateful t, double time, TraceReplayStateful.StatusDelegate status_delegate, TreePerspective perspective, Options options)
     : base(t, status_delegate, perspective, options)
 {
     Replay.SeekTo(time, StatusCallback);
 }