static void Main(string[] args) { ProfileOptimization.SetProfileRoot(Path.GetDirectoryName(typeof(Program).Assembly.Location)); ProfileOptimization.StartProfile("Startup.Profile"); var parseResult = Parser.Default.ParseArguments <Options>(args); if (parseResult.Errors.Any()) { return; } var options = parseResult.Value; var fileOptions = new DisassembleFileOptions { FilePath = options.FilePath, DisableOptimization = options.DisableOptimization, IsVerbose = options.IsVerbose }; try { SeeJitHelper.DisassembleFile(fileOptions, Console.Out); } catch (Exception ex) { Console.Error.WriteLine("Unhandled exception: " + ex.GetType()); Console.Error.WriteLine(ex.Message); Console.Error.WriteLine(ex.StackTrace); } }
private static List <Disassembler> GetFileDisassemblers(DisassembleFileOptions options, MessageWriter writer) { var begin = DateTime.Now; // Parsing writer.Write("; Parsing from file ... "); var syntaxTree = CSharpCompiler.ParseFrom(options.FilePath); var parsed = DateTime.Now; writer.WriteLine($"done. ({Diff(begin, parsed)})"); // Compiling writer.Write("; Compiling ... "); var compilationOptions = new CompilationOptions { SaveAssembly = options.SaveAssembly, DisableOptimization = options.DisableOptimization }; var assemblyName = Path.GetFileNameWithoutExtension(options.FilePath); var(_, assembly) = CSharpCompiler.Compile(assemblyName, syntaxTree, compilationOptions); var compiled = DateTime.Now; writer.WriteLine($"done. ({Diff(parsed, compiled)})"); // Analyzing writer.Write("; Analyzing ... "); var syntaxItems = CSharpHelper.CollectSyntax(syntaxTree.GetRoot()); var memberItems = CSharpHelper.CollectMembers(assembly, syntaxItems); var disassemblers = memberItems.Select(Disassembler.Create).ToList(); var analyzed = DateTime.Now; writer.WriteLine($"done. ({Diff(compiled, analyzed)})"); writer.WriteLine(""); return(disassemblers); }
public static void DisassembleFile(DisassembleFileOptions options, TextWriter output) { var writer = options.IsVerbose ? MessageWriter.From(output) : MessageWriter.Empty; List <Disassembler> disassemblers; try { disassemblers = GetFileDisassemblers(options, writer); } catch { writer.WriteLine("failed!"); throw; } using (var dt = DataTarget.AttachToProcess(Process.GetCurrentProcess().Id, UInt32.MaxValue, AttachFlag.Passive)) { var clr = dt.ClrVersions.Single(); output.WriteLine( "; {0:G} CLR {1} ({2}) on {3}.", clr.Flavor, clr.Version, Path.GetFileName(clr.ModuleInfo.FileName), clr.DacInfo.TargetArchitecture.ToString("G").ToLowerInvariant() ); var runtime = clr.CreateRuntime(); foreach (var disasm in disassemblers) { output.WriteLine(); disasm.Disassemble(runtime, output); } } }