示例#1
0
        private IEnumerable <CodeName> ExtractNames(CodeFrame codeFrame)
        {
            if (codeFrame.Symbols == null)
            {
                yield break;
            }

            var dr = new DebugReader(codeFrame.Symbols);

            if (dr.EnumerateVarSyms().Count() > 0)
            {
                foreach (var v in dr.FindVarSyms(Int32.MaxValue, dr.GetScopeSymByIndex(0)))
                {
                    var flags = (ElaVariableFlags)v.Flags;

                    if (!v.Name.StartsWith("$"))
                    {
                        var ln = dr.FindLineSym(v.Offset);
                        yield return(new CodeName(v.Name, (Int32)flags, ln.Line, ln.Column));
                    }
                }
            }
            else
            {
                foreach (var v in codeFrame.GlobalScope.EnumerateNames())
                {
                    var sv = codeFrame.GlobalScope.GetVariable(v);

                    if (!sv.VariableFlags.Set(ElaVariableFlags.Private) && !v.StartsWith("$"))
                    {
                        yield return(new CodeName(v, (Int32)sv.VariableFlags, 0, 0));
                    }
                }
            }
        }
示例#2
0
        internal void PrintSymTables(DebugReader gen)
        {
            var prev = false;

            if ((opt.ShowSymbols & SymTables.Lines) == SymTables.Lines)
            {
                Console.WriteLine("Lines:\r\n");
                Console.Write(gen.PrintSymTables(SymTables.Lines));
                prev = true;
            }

            if ((opt.ShowSymbols & SymTables.Scopes) == SymTables.Scopes)
            {
                Console.WriteLine((prev ? "\r\n" : String.Empty) + "Scopes:\r\n");
                Console.Write(gen.PrintSymTables(SymTables.Scopes));
            }

            if ((opt.ShowSymbols & SymTables.Vars) == SymTables.Vars)
            {
                Console.WriteLine((prev ? "\r\n" : String.Empty) + "Variables:\r\n");
                Console.Write(gen.PrintSymTables(SymTables.Vars));
            }

            if ((opt.ShowSymbols & SymTables.Functions) == SymTables.Functions)
            {
                Console.WriteLine((prev ? "\r\n" : String.Empty) + "Functions:\r\n");
                Console.Write(gen.PrintSymTables(SymTables.Functions));
            }
        }
示例#3
0
        private void ApplyCommandLineArguments()
        {
            //this.client.OnDebugOutput += new DebugOutputDel(this.DebugOutputHandler);

            //using (OutputLineReader lineRdr = new OutputLineReader(this.client))
            using (DebugReader dbgRdr = new DebugReader(this.client))
            {
                string dbgLine;

                //lineRdr.OnOutputLine += new LineReaderDeleg(this.DebugOutputHandler);

                if (this.imagePath != null)
                {
                    this.symbols.SetImagePath(this.imagePath);
                }

                if (this.symbolsPath != null)
                {
                    this.symbols.SetSymbolPath(this.symbolsPath);
                }

                if (this.dumpFile != null)
                {
                    this.client.OpenDumpFile(this.dumpFile);

                    while ((dbgLine = dbgRdr.ReadLine()) != null)
                    {
                        Console.Out.WriteLine(dbgLine);
                    }
                }
                else
                {
                    throw new DumpStkExcept(1, "No dump file specified");
                }

                this.ctrl.EngineOptions  |= EngineOptions.InitialBreak;
                this.client.ExceptionHit += new EventHandler <ExceptionEventArgs>(ExceptionHandler);

                if (this.ctrl.WaitForEvent() == false)
                {
                    throw new DumpStkExcept(1, "WaitForEvent failed");
                }

                while ((dbgLine = dbgRdr.ReadLine()) != null)
                {
                    Console.Out.WriteLine(dbgLine);
                }
            }
        }
示例#4
0
        private IEnumerable <VarSym> LookVars(DebugReader dr, int offset, int scopeIndex)
        {
            var scope = dr.GetScopeSymByIndex(scopeIndex);
            var list  = new List <VarSym>();

            foreach (var vs in dr.FindVarSyms(offset, scope))
            {
                list.Add(vs);
            }

            if (scope.Index != 0 && scope.ParentIndex != scope.Index)
            {
                list.AddRange(LookVars(dr, offset, scope.ParentIndex));
            }

            return(list);
        }
示例#5
0
        public virtual string GetFunctionName()
        {
            var funName = DEF_NAME;

            if (vm != null)
            {
                var mod  = vm.Assembly.GetModule(ModuleHandle);
                var syms = mod.Symbols;

                if (syms != null)
                {
                    var dr = new DebugReader(syms);
                    var fs = dr.GetFunSymByHandle(Handle);

                    if (fs != null && fs.Name != null)
                    {
                        funName = fs.Name;
                    }
                }
                else
                {
                    foreach (var sv in mod.GlobalScope.Locals)
                    {
                        var v = vm.GetVariableByHandle(ModuleHandle, sv.Value.Address);

                        if (v.TypeId == ElaMachine.FUN && ((ElaFunction)v.Ref).Handle == Handle)
                        {
                            funName = sv.Key;
                            break;
                        }
                    }
                }
            }

            if (funName != DEF_NAME && Format.IsSymbolic(funName))
            {
                funName = "(" + funName + ")";
            }

            return(funName);
        }
示例#6
0
        private VarSym LookVar(DebugReader dr, int offset, int scopeIndex, string var)
        {
            var scope = dr.GetScopeSymByIndex(scopeIndex);

            foreach (var vs in dr.FindVarSyms(offset, scope))
            {
                if (vs.Name == var)
                {
                    return(vs);
                }
            }

            if (scope.Index != 0)
            {
                return(LookVar(dr, offset, scope.ParentIndex, var));
            }
            else
            {
                return(null);
            }
        }
示例#7
0
        public CallStack BuildCallStack(int currentOffset, CodeFrame errModule, FileInfo moduleFile, Stack<StackPoint> callChain)
        {
            var syms = new DebugReader(errModule.Symbols);
            var frames = new List<CallFrame>();
            var lp = syms.FindLineSym(currentOffset - 1);
            var retval = new CallStack(
                    moduleFile,
                    lp != null ? lp.Line : 0,
                    lp != null ? lp.Column : 0,
                    frames
                );

            if (callChain == null || callChain.Count == 0)
                return retval;

            var mem = default(StackPoint);
            var first = true;
            var offset = 0;

            do
            {
                mem = callChain.Pop();
                var mod = Assembly.GetModuleName(mem.ModuleHandle);
                syms = new DebugReader(Assembly.GetModule(mem.ModuleHandle).Symbols);
                offset = first ? currentOffset - 1 : mem.BreakAddress - 1;
                var glob = callChain.Count == 0 || offset < 0;
                var funSym = !glob ? syms.FindFunSym(offset) : null;
                var line = syms != null && offset > 0 ? syms.FindLineSym(offset) : null;
                frames.Add(new CallFrame(glob, mod,
                    funSym != null ?
                        funSym.Name != null ? funSym.Name : String.Format(FUNC_PARS, funSym.Parameters) :
                        glob ? null : FUNC,
                    offset, line));
                first = false;
            }
            while (callChain.Count > 0 && offset > 0);

            return retval;
        }
示例#8
0
        private Location GetLocation(string name)
        {
            var sv = CodeFrame.GlobalScope.GetVariable(name);

            if (CodeFrame.Symbols != null)
            {
                var dr  = new DebugReader(CodeFrame.Symbols);
                var sym = dr.FindVarSym(sv.VariableAddress, 0);

                if (sym != null)
                {
                    var ln = dr.FindLineSym(sym.Offset);

                    if (ln != null)
                    {
                        return(new Location(ln.Line, ln.Column));
                    }
                }
            }

            return(new Location(0, 0));
        }
示例#9
0
        private VarSym GetNameInfo(int position, CodeDocument doc)
        {
            var word  = sci.GetWordAt(position) ?? GetOperator(position, 0);
            var frame = doc != null ? doc.Unit : null;

            if (word != null && frame != null)
            {
                var dr      = new DebugReader(((CompiledUnit)frame).CodeFrame.Symbols);
                var lineNum = sci.GetLineFromPosition(position);
                var colNum  = sci.GetColumnFromPosition(position);

                var ln    = dr.FindClosestLineSym(lineNum + 1, colNum + 1);
                var scope = default(ScopeSym);

                if (ln != null && (scope = (dr.FindScopeSym(lineNum + 1, colNum + 1) ?? dr.GetScopeSymByIndex(0))) != null)
                {
                    return(LookVar(dr, ln.Offset, scope.Index, word));
                }
            }

            return(null);
        }
示例#10
0
        public void DumpStack()
        {
            using (DebugReader dbgRdr = new DebugReader(this.client))
            {
                uint            count = 50;
                DebugStackTrace frames;

                Console.Out.WriteLine("First {0} frames of the call stack:", count);

                frames = this.ctrl.GetStackTrace(this.traceFrom[0], this.traceFrom[1], this.traceFrom[2], count);

                DebugSymbols sym = new DebugSymbols(this.client);

                foreach (DebugStackFrame f in frames)
                {
                    string frameSym;
                    ulong  displace;

                    sym.GetNameByOffset(f.InstructionOffset, out frameSym, out displace);
                }

                StackTraceOutput outputInfo =
                    StackTraceOutput.SourceLine | StackTraceOutput.FrameAddresses | StackTraceOutput.ColumnNames | StackTraceOutput.FrameNumbers;

                this.ctrl.OutputStackTrace(
                    OutputControl.ToAllClients,
                    frames,
                    outputInfo);

                string dbgLine;

                while ((dbgLine = dbgRdr.ReadLine()) != null)
                {
                    Console.Out.WriteLine(dbgLine);
                }
            }
        }
示例#11
0
        public void DoComplete(int pos, CodeDocument doc)
        {
            if (doc == null)
                return;

            if (TestIfComments(pos, true) || TestIfComments(pos - 1, false))
                return;

            if (sci.CurrentPosition > 0 && sci.CharAt(sci.CurrentPosition - 1) == '.')
            {
                ListModuleMembers(doc, pos - 2);
                return;
            }

            var names = default(List<AutocompleteSymbol>);

            if (doc.Unit != null)
            {
                var frame = ((CompiledUnit)doc.Unit).CodeFrame;
                var dr = new DebugReader(frame.Symbols);
                var col = sci.GetColumnFromPosition(sci.CurrentPosition);
                var ln = dr.FindClosestLineSym(sci.CurrentLine + 1, col + 1);

                var scope = col == 0 || col == 1 ? dr.GetScopeSymByIndex(0) :
                    dr.FindScopeSym(sci.CurrentLine + 1, col + 1);

                if (scope == null)
                    scope = dr.GetScopeSymByIndex(0);

                if (scope != null)
                {
                    var vars = LookVars(dr, ln != null ? ln.Offset : scope.EndOffset, scope.Index);
                    names = vars
                        .Where(v => v.Name[0] != '$')
                        .Select(v =>
                            {
                                var f = (ElaVariableFlags)v.Flags;
                                return new AutocompleteSymbol(v.Name,
                                    f.Set(ElaVariableFlags.Module) ? AutocompleteSymbolType.Module :
                                    f.Set(ElaVariableFlags.TypeFun) ? AutocompleteSymbolType.Type :
                                    f.Set(ElaVariableFlags.ClassFun) ? AutocompleteSymbolType.Member :
                                        AutocompleteSymbolType.Variable);
                            })
                        .ToList();
                }
            }

            var line = sci.GetLine(sci.CurrentLine).Text.Trim('\r', '\n', '\0');
            var tl = line.Trim();
            var keywords = new List<AutocompleteSymbol>();

            keywords.Add(Snippet("if"));

            if (tl.Length == 0)
            {
                keywords.Add(Snippet("open"));
                keywords.Add(Snippet("let"));

                if (line.Length > 0)
                {
                    keywords.Add(Snippet("et"));
                    keywords.Add(Snippet("where"));
                }
            }
            else if (tl.EndsWith("="))
                keywords.Add(Snippet("let"));
            else if (tl.EndsWith("let"))
            {
                keywords.Add(Snippet("private"));
                keywords.Add(Snippet("inline"));
            }

            if (names != null)
                keywords.AddRange(names);

            app.GetService<IAutocompleteService>().ShowAutocomplete(keywords);
        }
示例#12
0
        private VarSym LookVar(DebugReader dr, int offset, int scopeIndex, string var)
        {
            var scope = dr.GetScopeSymByIndex(scopeIndex);

            foreach (var vs in dr.FindVarSyms(offset, scope))
                if (vs.Name == var)
                    return vs;

            if (scope.Index != 0)
                return LookVar(dr, offset, scope.ParentIndex, var);
            else
                return null;
        }
示例#13
0
        private IEnumerable<VarSym> LookVars(DebugReader dr, int offset, int scopeIndex)
        {
            var scope = dr.GetScopeSymByIndex(scopeIndex);
            var list = new List<VarSym>();

            foreach (var vs in dr.FindVarSyms(offset, scope))
                list.Add(vs);

            if (scope.Index != 0 && scope.ParentIndex != scope.Index)
                list.AddRange(LookVars(dr, offset, scope.ParentIndex));

            return list;
        }
示例#14
0
        public void DoComplete(int pos, CodeDocument doc)
        {
            if (doc == null)
            {
                return;
            }

            if (TestIfComments(pos, true) || TestIfComments(pos - 1, false))
            {
                return;
            }

            if (sci.CurrentPosition > 0 && sci.CharAt(sci.CurrentPosition - 1) == '.')
            {
                ListModuleMembers(doc, pos - 2);
                return;
            }

            var names = default(List <AutocompleteSymbol>);

            if (doc.Unit != null)
            {
                var frame = ((CompiledUnit)doc.Unit).CodeFrame;
                var dr    = new DebugReader(frame.Symbols);
                var col   = sci.GetColumnFromPosition(sci.CurrentPosition);
                var ln    = dr.FindClosestLineSym(sci.CurrentLine + 1, col + 1);

                var scope = col == 0 || col == 1 ? dr.GetScopeSymByIndex(0) :
                            dr.FindScopeSym(sci.CurrentLine + 1, col + 1);

                if (scope == null)
                {
                    scope = dr.GetScopeSymByIndex(0);
                }

                if (scope != null)
                {
                    var vars = LookVars(dr, ln != null ? ln.Offset : scope.EndOffset, scope.Index);
                    names = vars
                            .Where(v => v.Name[0] != '$')
                            .Select(v =>
                    {
                        var f = (ElaVariableFlags)v.Flags;
                        return(new AutocompleteSymbol(v.Name,
                                                      f.Set(ElaVariableFlags.Module) ? AutocompleteSymbolType.Module :
                                                      f.Set(ElaVariableFlags.TypeFun) ? AutocompleteSymbolType.Type :
                                                      f.Set(ElaVariableFlags.ClassFun) ? AutocompleteSymbolType.Member :
                                                      AutocompleteSymbolType.Variable));
                    })
                            .ToList();
                }
            }

            var line     = sci.GetLine(sci.CurrentLine).Text.Trim('\r', '\n', '\0');
            var tl       = line.Trim();
            var keywords = new List <AutocompleteSymbol>();

            keywords.Add(Snippet("if"));

            if (tl.StartsWith("if") && tl.Length > 2)
            {
                keywords.Add(Snippet("then"));
            }

            if (tl.Length == 0)
            {
                keywords.Add(Snippet("open"));
                keywords.Add(Snippet("let"));

                if (line.Length > 0)
                {
                    keywords.Add(Snippet("where"));
                }
            }
            else if (tl.EndsWith("="))
            {
                keywords.Add(Snippet("let"));
            }
            else
            {
                keywords.Add(Snippet("else"));
            }

            if (names != null)
            {
                keywords.AddRange(names);
            }

            app.GetService <IAutocompleteService>().ShowAutocomplete(keywords);
        }
示例#15
0
        private VarSym GetNameInfo(int position, CodeDocument doc)
        {
            var word = sci.GetWordAt(position) ?? GetOperator(position, 0);
            var frame = doc != null ? doc.Unit : null;

            if (word != null && frame != null)
            {
                var dr = new DebugReader(((CompiledUnit)frame).CodeFrame.Symbols);
                var lineNum = sci.GetLineFromPosition(position);
                var colNum = sci.GetColumnFromPosition(position);

                var ln = dr.FindClosestLineSym(lineNum + 1, colNum + 1);
                var scope = default(ScopeSym);

                if (ln != null && (scope = (dr.FindScopeSym(lineNum + 1, colNum + 1) ?? dr.GetScopeSymByIndex(0))) != null)
                    return LookVar(dr, ln.Offset, scope.Index, word);
            }

            return null;
        }
示例#16
0
        public int SearchBlockIndex(byte[] input, int inputLen)
        {
            SpanReader sr = new SpanReader(BlockBuffer);

            sr.Position = 2;

            int    indexEntryCount = sr.ReadInt16();
            int    realEntryCount  = (((indexEntryCount - 1) / 2) - 1);
            ushort blockSize       = ParentVolume.GetBlockSize();

            if (indexEntryCount == 1)
            {
                // return the first
                sr.Position = blockSize - 4;
                return(sr.ReadInt32());
            }

            // First
            sr.Position = blockSize - 0x08;
            short entryOffset = sr.ReadInt16();
            short entryLength = sr.ReadInt16();

            sr.Position = entryOffset;
            byte[] entryIndexer = sr.ReadBytes(entryLength);
            int    diff         = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);

            if (diff < 0)
            {
                // return the first block index
                sr.Position = (blockSize - 0x08) + 4;
                return(sr.ReadInt32());
            }

            // Last
            sr.Position  = blockSize - (realEntryCount * 0x08);
            entryOffset  = sr.ReadInt16();
            entryLength  = sr.ReadInt16();
            sr.Position  = entryOffset;
            entryIndexer = sr.ReadBytes(entryLength);
            diff         = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);

            if (diff > 0)
            {
                // return the last block index
                sr.Position = blockSize - (realEntryCount * 0x08) + 4;
                return(sr.ReadInt32());
            }

            int min = 0;
            int max = realEntryCount;
            int mid = (min + max) / 2;

            while (min < max)
            {
                if (max - min < 8)
                {
                    mid = min;
                    int baseOffset      = blockSize - (mid * 0x08);
                    int entryitorOffset = baseOffset;
                    if (max < min)
                    {
                        return(-1);
                    }

                    while (min <= max)
                    {
                        entryitorOffset -= 0x08;
                        sr.Position      = entryitorOffset;
                        entryOffset      = sr.ReadInt16();

                        int entryIndexOffset = (mid * 0x08 - blockSize) + baseOffset + entryitorOffset;
                        sr.Position = entryIndexOffset + 2;

                        entryLength  = sr.ReadInt16();
                        sr.Position  = entryOffset;
                        entryIndexer = sr.ReadBytes(entryLength);
                        diff         = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);
                        if (diff == 0)
                        {
                            sr.Position = entryIndexOffset - 4;
                            return(sr.ReadInt32());
                        }
                        else if (diff < 0)
                        {
                            sr.Position = entryIndexOffset + 4;
                            return(sr.ReadInt32());
                        }

                        min++;
                    }

                    return(-1);
                }

                sr.Position  = blockSize - (mid * 0x08);
                entryOffset  = sr.ReadInt16();
                entryLength  = sr.ReadInt16();
                sr.Position  = entryOffset;
                entryIndexer = sr.ReadBytes(entryLength);

                diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);
                if (diff == 0)
                {
                    // return the matching index
                    sr.Position = blockSize - (mid * 0x08) + 4;
                    return(sr.ReadInt32());
                }
                else if (diff > 0)
                {
                    min = mid;
                }
                else
                {
                    max = mid;
                }

                mid = (min + max) / 2;
            }

            throw new Exception("Failed to bsearch for the block entry.");
        }
示例#17
0
        public bool SearchEntry(byte[] input, int inputLen, out int result)
        {
            result = 0;

            SpanReader sr = new SpanReader(BlockBuffer);

            sr.Position = 2;

            int    entryCount = sr.ReadInt16() / 2;
            ushort blockSize  = ParentVolume.GetBlockSize();

            // Check first
            sr.Position = blockSize - 0x08;
            short entryOffset = sr.ReadInt16();
            short entryLength = sr.ReadInt16();

            sr.Position = entryOffset;
            byte[] entryIndexer = sr.ReadBytes(entryLength);

            int diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);

            if (diff < 0)
            {
                result = 0;
                return(false);
            }

            // Check last
            sr.Position  = blockSize - (entryCount * 0x08);
            entryOffset  = sr.ReadInt16();
            entryLength  = sr.ReadInt16();
            sr.Position  = entryOffset;
            entryIndexer = sr.ReadBytes(entryLength);
            diff         = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);
            if (diff > 0)
            {
                result = -entryCount;
                return(false);
            }

            int min = 0;
            int max = entryCount;
            int mid = (min + max) / 2;

            while (min < max)
            {
                if (max - min < 8)
                {
                    mid = min;
                    int baseOffset      = blockSize - (mid * 0x08);
                    int entryitorOffset = baseOffset;
                    if (max < min)
                    {
                        return(false);
                    }

                    while (min <= max)
                    {
                        entryitorOffset -= 0x08;
                        sr.Position      = entryitorOffset;
                        entryOffset      = sr.ReadInt16();

                        sr.Position  = (mid * 0x08 - blockSize) + baseOffset + entryitorOffset;
                        sr.Position += 2;

                        entryLength  = sr.ReadInt16();
                        sr.Position  = entryOffset;
                        entryIndexer = sr.ReadBytes(entryLength);
                        diff         = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);
                        if (diff < 1)
                        {
                            result = min;
                            return(diff == 0);
                        }

                        min++;
                    }

                    return(false);
                }

                sr.Position  = blockSize - (mid * 0x08);
                entryOffset  = sr.ReadInt16();
                entryLength  = sr.ReadInt16();
                sr.Position  = entryOffset;
                entryIndexer = sr.ReadBytes(entryLength);

                diff = DebugReader.CompareEntries(input, inputLen, entryIndexer, entryLength);
                if (diff == 0)
                {
                    result = mid - 1;
                    return(true);
                }
                else if (diff > 0)
                {
                    min = mid;
                }
                else
                {
                    max = mid;
                }

                mid = (min + max) / 2;
            }

            throw new Exception("Failed to bsearch the entry.");
        }
示例#18
0
        private IEnumerable<CodeName> ExtractNames(CodeFrame codeFrame)
        {
            if (codeFrame.Symbols == null)
                yield break;

            var dr = new DebugReader(codeFrame.Symbols);

            if (dr.EnumerateVarSyms().Count() > 0)
            {
                foreach (var v in dr.FindVarSyms(Int32.MaxValue, dr.GetScopeSymByIndex(0)))
                {
                    var flags = (ElaVariableFlags)v.Flags;

                    if (!v.Name.StartsWith("$"))
                    {
                        var ln = dr.FindLineSym(v.Offset);
                        yield return new CodeName(v.Name, (Int32)flags, ln.Line, ln.Column);
                    }
                }
            }
            else
            {
                foreach (var v in codeFrame.GlobalScope.EnumerateNames())
                {
                    var sv = codeFrame.GlobalScope.GetVariable(v);

                    if (!sv.VariableFlags.Set(ElaVariableFlags.Private) && !v.StartsWith("$"))
                        yield return new CodeName(v, (Int32)sv.VariableFlags, 0, 0);
                }
            }
        }
示例#19
0
        private static int Execute(CodeAssembly asm, bool interactive)
        {
            var mod = asm.GetRootModule();

            if (opt.ShowEil)
            {
                var gen = new EilGenerator(mod);
                Console.WriteLine("EIL ({0}-{1}):", lastOffset, mod.Ops.Count - 1);
                Console.Write(gen.Generate(lastOffset));
                lastOffset = mod.Ops.Count;
            }
            else if (opt.ShowSymbols != SymTables.None)
            {
                var gen = new DebugReader(mod.Symbols);
                helper.PrintSymTables(gen);
                lastOffset = mod.Ops.Count;
            }
            else
            {
                try
                {
                    if (vm == null)
                        vm = new ElaMachine(asm);
                    else
                    {
                        vm.RefreshState();
                        vm.Recover();
                    }

                    if (opt.ShowTime && !interactive)
                        Warmup(asm); //GIT

                    var os = lastOffset;
                    lastOffset = mod.Ops.Count;
                    var sw = new Stopwatch();
                    sw.Start();
                    var exer = vm.Run(os);
                    sw.Stop();

                    if (opt.ShowTime && !interactive)
                        Console.WriteLine("Execution time: {0}", sw.Elapsed);

                    if (exer.ReturnValue.TypeCode != ElaTypeCode.None && exer.ReturnValue.TypeCode != ElaTypeCode.Unit)
                        Console.WriteLine(vm.PrintValue(exer.ReturnValue));
                }
                catch (ElaException ex)
                {
                    helper.PrintError(ex.ToString());
                    return R_ERR;
                }
            }

            return R_OK;
        }
示例#20
0
        static void Main(string[] args)
        {
            ParseArguments(args);

            if (PdbFilePath == null)
            {
                Console.Error.WriteLine(@"PDBSharp.Dumper
  Usage: PDBSharp.Dumper <options> <file.pdb>
    [-dump]            Save individual PDB Streams to files
    [-dump-modules]    Verbose output for DBI Modules
    [-dump-leaves]     Verbose output for TPI Leaves
    [-dump-syms]       Verbose output for DBI Symbols
    [-print]           Extract and print type definitions");
                Environment.Exit(1);
            }

#if PERF
            Console.WriteLine("Starting...");
            Stopwatch sw = new Stopwatch();
            sw.Start();
#endif

            PDBFile           pdb = PDBFile.Open(PdbFilePath);
            IServiceContainer sc  = pdb.Services;

            DBIReader         dbi         = sc.GetService <DBIReader>();
            TPIReader         tpi         = sc.GetService <TPIReader>();
            StreamTableReader streamTable = sc.GetService <StreamTableReader>();

            if (OptPrintDecls)
            {
                var        tree = new GraphBuilder(sc).Build();
                CodeWriter cw   = new CodeWriter(tree);
#if !PERF
                cw.Write(Console.Out);
#endif
            }

            if (OptDumpLeaves)
            {
                pdb.OnTpiInit += Pdb_OnTpiInit;
            }
            if (OptDumpModules || OptDumpSymbols)
            {
                pdb.OnDbiInit += Pdb_OnDbiInit;
            }

            if (OptDumpStreams)
            {
                DirectoryInfo dumpDir = Directory.CreateDirectory(Path.GetFileNameWithoutExtension(PdbFilePath));
                for (int i = 1; i < streamTable.NumStreams; i++)
                {
                    string dumpPath = Path.Combine(dumpDir.ToString(), $"stream{i}.bin");

                    byte[] stream = streamTable.GetStream(i);
                    File.WriteAllBytes(dumpPath, stream);
                }
            }

            /*
             * foreach(var type in ctx.TpiReader.Types) {
             *      //Console.WriteLine(type);
             * }*/

            TPIHashReader      tpiHash      = sc.GetService <TPIHashReader>();
            UdtNameTableReader udtNameTable = sc.GetService <UdtNameTableReader>();
            TypeResolver       resolver     = sc.GetService <TypeResolver>();
            if (tpiHash != null && udtNameTable != null)
            {
                foreach (var pair in tpiHash.NameIndexToTypeIndex)
                {
                    string         name = udtNameTable.GetString(pair.Key);
                    ILeafContainer leaf = resolver.GetTypeByIndex(pair.Value);
#if !PERF
                    Console.WriteLine($"=> {name} [NI={pair.Key}] [TI={pair.Value}]");
                    Console.WriteLine(leaf.Data.GetType().Name);
#endif
                }
            }

            foreach (var contrib in dbi.SectionContribs.SectionContribs)
            {
#if !PERF
                ObjectDumper.Dump(contrib);
#endif
            }

            DebugReader debug = dbi.DebugInfo;
            if (debug != null && debug.FPO != null)
            {
                foreach (var frame in debug.FPO.Frames)
                {
#if !PERF
                    ObjectDumper.Dump(frame);
#endif
                }
            }

            foreach (var container in dbi.Modules)
            {
#if !PERF
                Console.WriteLine($"[MODULE => {container.Info.ModuleName}]");
                Console.WriteLine($"[OBJECT => {container.Info.ObjectFileName}]");
                Console.WriteLine($"[SRC    => {container.Info.SourceFileName}]");
                if (container.Module != null)
                {
                    Console.WriteLine($"[TYPE   => {container.Module.GetType().Name}");
                }
                Console.WriteLine();
#endif

                IModule mod = container.Module;
                if (mod != null)
                {
                    foreach (var sym in mod.Symbols)
                    {
#if !PERF
                        Console.WriteLine(sym);
#endif
                    }
                }
            }

            foreach (var type in tpi.Types)
            {
#if !PERF
                Console.WriteLine(type);
#endif
            }

#if !PERF
            Console.WriteLine("Press Enter to continue...");
            Console.ReadLine();
#else
            sw.Stop();
            Console.WriteLine($"Finished in {sw.Elapsed.TotalSeconds} seconds");
#endif
        }
示例#21
0
        private static int Execute(CodeAssembly asm, bool interactive)
        {
            var mod = asm.GetRootModule();

            if (opt.ShowEil)
            {
                var gen = new EilGenerator(mod);
                Console.WriteLine("EIL ({0}-{1}):", lastOffset, mod.Ops.Count - 1);
                Console.Write(gen.Generate(lastOffset));
                lastOffset = mod.Ops.Count;
            }
            else if (opt.ShowSymbols != SymTables.None)
            {
                var gen = new DebugReader(mod.Symbols);
                helper.PrintSymTables(gen);
                lastOffset = mod.Ops.Count;
            }
            else
            {
                try
                {
                    if (vm == null)
                    {
                        vm = new ElaMachine(asm);
                        vm.AddTracePointListener(new TracePointListener());
                    }
                    else
                    {
                        vm.RefreshState();
                        vm.Recover();
                    }

                    if (opt.ShowTime != 0 && !interactive)
                    {
                        Warmup(asm); //GIT
                    }
                    var os = lastOffset;
                    lastOffset = mod.Ops.Count;
                    var sw = new Stopwatch();
                    sw.Start();
                    var exer = default(ExecutionResult);

                    if (opt.ShowTime != 0)
                    {
                        for (var i = 0; i < opt.ShowTime; i++)
                        {
                            exer = vm.Run(os);
                        }

                        sw.Stop();
                    }
                    else
                    {
                        exer = vm.Run(os);
                    }

                    if (opt.ShowTime != 0 && !interactive)
                    {
                        Console.WriteLine("Executed: {0} time(s). Execution time: {1}", opt.ShowTime, sw.Elapsed);
                    }

                    if (exer.ReturnValue.TypeCode != ElaTypeCode.None && exer.ReturnValue.TypeCode != ElaTypeCode.Unit)
                    {
                        Console.WriteLine(vm.PrintValue(exer.ReturnValue));
                    }
                }
                catch (ElaException ex)
                {
                    helper.PrintError(ex.ToString());
                    return(R_ERR);
                }
            }

            return(R_OK);
        }
示例#22
0
        private Location GetLocation(string name)
        {
            var sv = CodeFrame.GlobalScope.GetVariable(name);

            if (CodeFrame.Symbols != null)
            {
                var dr = new DebugReader(CodeFrame.Symbols);
                var sym = dr.FindVarSym(sv.VariableAddress, 0);

                if (sym != null)
                {
                    var ln = dr.FindLineSym(sym.Offset);

                    if (ln != null)
                        return new Location(ln.Line, ln.Column);
                }
            }

            return new Location(0, 0);
        }