コード例 #1
0
        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);
            }
        }
コード例 #2
0
ファイル: SeeJitHelper.cs プロジェクト: wipphj/SeeJit
        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);
        }
コード例 #3
0
ファイル: SeeJitHelper.cs プロジェクト: dreamsql/SeeJit
        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);
                }
            }
        }