void Pdb::Locals() { VectorMap<String, Value> prev = DataMap(locals); locals.Clear(); int q = ~framelist; if(q >= 0 && q < frame.GetCount()) { Frame& f = frame[q]; for(int i = 0; i < f.param.GetCount(); i++) Vis(locals, f.param.GetKey(i), prev, Visualise(f.param[i])); for(int i = 0; i < f.local.GetCount(); i++) Vis(locals, f.local.GetKey(i), prev, Visualise(f.local[i])); } }
void Pdb::SetTree(const String& exp) { SaveTree(); tree.Clear(); NamedVal nv; try { CParser p(exp); nv.val = Exp(p); } catch(CParser::Error) { return; } nv.name = exp; String n = exp; if(nv.val.type >= 0) n = GetType(nv.val.type).name; tree.SetRoot(Null, RawToValue(nv), n + '=' + Visualise(nv.val).GetString()); if(nv.val.type >= 0) { String w = treetype.Get(n, Null); LOG("SetTree " << n << ' ' << w); tree.Open(0); CParser p(w); try { Point sc; sc.x = p.ReadInt(); sc.y = p.ReadInt(); int cursor = p.ReadInt(); ExpandTreeType(0, p); tree.ScrollTo(sc); if(cursor >= 0) tree.SetCursor(cursor); } catch(CParser::Error) {} } }
void Pdb::TreeNode(int parent, const String& name, Pdb::Val val) { NamedVal nv; nv.name = name; nv.val = val; tree.Add(parent, Null, RawToValue(nv), name + "=" + Visualise(val).GetString(), val.type >= 0 || val.ref > 0); }
void Pdb::Explore(const Val& val, const VectorMap<String, Value>& prev) { const Type& t = GetType(val.type); for(int i = 0; i < t.base.GetCount(); i++) { Val b = t.base[i]; b.address += val.address; Vis(explorer, ':' + GetType(b.type).name, prev, Visualise(b)); } for(int i = 0; i < t.member.GetCount(); i++) { Val r = t.member[i]; r.address += val.address; Vis(explorer, '.' + t.member.GetKey(i), prev, Visualise(r)); } for(int i = 0; i < t.static_member.GetCount(); i++) Vis(explorer, "::" + t.static_member.GetKey(i), prev, Visualise(t.static_member[i])); }
void Pdb::Watches() { VectorMap<String, Value> prev = DataMap(watches); for(int i = 0; i < watches.GetCount(); i++) { bool ch; watches.Set(i, 1, Vis((String)watches.Get(i, 0), prev, Visualise((String)watches.Get(i, 0)), ch)); if(ch) watches.SetDisplay(i, 0, Single<RedDisplay>()); else watches.SetDisplay(i, 0, StdDisplay()); } }
void Pdb::AddThis(const VectorMap<String, Val>& m, adr_t address, const VectorMap<String, Value>& prev) { for(int i = 0; i < m.GetCount() && self.GetCount() < 2000; i++) { Val mv = m[i]; mv.address += address; Visual vis; try { vis = Visualise(mv); } catch(CParser::Error e) { vis.Cat(e, SColorDisabled); } Vis(self, m.GetKey(i), prev, vis); } }
void Pdb::TryAuto(const String& exp, const VectorMap<String, Value>& prev) { if(autos.Find(exp) < 0) { Visual r; try { CParser p(exp); Val v = Exp(p); Visualise(r, v, 2); } catch(CParser::Error) { r.Clear(); } if(r.part.GetCount()) Vis(autos, exp, prev, r); } }
bool Pdb::Tip(const String& exp, CodeEditor::MouseTip& mt) { /* mt.display = &StdDisplay(); mt.value = exp; mt.sz = Size(100, 20); return true;*/ DR_LOG("Pdb::Tip"); Visual r; try { CParser p(exp); Val v = Exp(p); Visualise(r, v, 2); if(r.part.GetCount()) { mt.sz = r.GetSize() + Size(4, 4); mt.value = RawPickToValue(r); mt.display = &Single<VisualDisplay>(); DR_LOG("Pdb::Tip true"); return true; } } catch(CParser::Error) {} DR_LOG("Pdb::Tip false"); return false; }
void Pdb::Sync0(Thread& ctx, Frame *single_frame) { if(!single_frame) { stop = false; framelist.Clear(); frame.Clear(); current_frame = NULL; } STACKFRAME64 stackFrame = {0}; stackFrame.AddrPC.Mode = stackFrame.AddrFrame.Mode = stackFrame.AddrStack.Mode = AddrModeFlat; DWORD machineType = IMAGE_FILE_MACHINE_I386; void *c; #ifdef CPU_64 if(win64) { machineType = IMAGE_FILE_MACHINE_AMD64; stackFrame.AddrPC.Offset = ctx.context64.Rip; stackFrame.AddrFrame.Offset = ctx.context64.Rbp; stackFrame.AddrStack.Offset = ctx.context64.Rsp; c = &ctx.context64; } else #endif { machineType = IMAGE_FILE_MACHINE_I386; stackFrame.AddrPC.Offset = ctx.context32.Eip; stackFrame.AddrFrame.Offset = ctx.context32.Ebp; stackFrame.AddrStack.Offset = ctx.context32.Esp; c = &ctx.context32; } DWORD64 lastFrame = 0; // Prevent loops with optimised stackframes int fc = -1; while(::StackWalk64(machineType, hProcess, ctx.hThread, &stackFrame, c, 0, ::SymFunctionTableAccess64, ::SymGetModuleBase64, 0)) { if(stackFrame.AddrPC.Offset == 0 || lastFrame >= stackFrame.AddrFrame.Offset) { LLOG("Invalid stack frame"); break; } lastFrame = stackFrame.AddrFrame.Offset; LLOG("PC: " << Hex(stackFrame.AddrPC.Offset)); Frame& f = single_frame ? *single_frame : frame.Add(); f.pc = stackFrame.AddrPC.Offset; f.frame = stackFrame.AddrFrame.Offset; f.stack = stackFrame.AddrStack.Offset; f.fn = GetFnInfo(f.pc); String r; if(IsNull(f.fn.name)) { if(single_frame) return; r = Hex(f.pc); for(int i = 0; i < module.GetCount(); i++) { const ModuleInfo& m = module[i]; if(f.pc >= m.base && f.pc < m.base + m.size) { r << " (" << GetFileName(m.path) << ")"; break; } } } else { GetLocals(f, ctx, f.param, f.local); if(single_frame) return; r = f.fn.name; r << '('; for(int i = 0; i < f.param.GetCount(); i++) { if(i) r << ", "; r << f.param.GetKey(i) << "=" << Visualise(f.param[i]).GetString(); } r << ')'; if(fc < 0) fc = frame.GetCount() - 1; } framelist.Add(frame.GetCount() - 1, r); } framelist <<= max(fc, 0); }