Hello Mirek,
After a very long time, I just started to do some c++ again and, hence, use theIDE. But I had quite some problems debugging with Visual C++ (2010/32 bit).
Amongst the problems are crashing (I just upgraded to rev 7655 yesterday, but did not test that one a lot) and inability to watch variables (also with 7655). All my variables are either 0 (numeric ones) or marked with '??'.
Are there any added preconditions for debugging with VC now?
Best regards,
Frank
BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserContext) { LocalsCtx& c = *(LocalsCtx *)UserContext; if(pSym->Tag == SymTagFunction) return TRUE; Val& v = (pSym->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER ? c.param : c.local).GetAdd(pSym->Name); v.address = (adr_t)pSym->Address; if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGISTER) v.address = pSym->Register; else if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE) { if(pSym->Register == CV_ALLREG_VFRAME) { #ifdef CPU_64 if(c.pdb->win64) v.address += c.pdb->GetCpuRegister(*c.context, CV_AMD64_RBP); else #endif v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP); } else v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register); } else if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE) v.address += c.frame; c.pdb->TypeVal(v, pSym->TypeIndex, (adr_t)pSym->ModBase); LLOG("LOCAL " << pSym->Name << ": " << Format64Hex(v.address)); return TRUE; }
BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserContext) { LocalsCtx& c = *(LocalsCtx *)UserContext; if(pSym->Tag == SymTagFunction) return TRUE; Val& v = (pSym->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER ? c.param : c.local).GetAdd(pSym->Name); v.address = (adr_t)pSym->Address; RLOG("-------------------------"); RDUMP(Format64Hex(v.address)); if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGISTER) v.address = pSym->Register; else if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE) { if(pSym->Register == CV_ALLREG_VFRAME) { #ifdef CPU_64 if(c.pdb->win64) v.address += c.pdb->GetCpuRegister(*c.context, CV_AMD64_RBP); else #endif v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP); RDUMP(Format64Hex(v.address)); } else v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register); } else if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE) { RDUMP(Format64Hex(c.frame)); v.address += c.frame; } c.pdb->TypeVal(v, pSym->TypeIndex, (adr_t)pSym->ModBase); RLOG("LOCAL " << pSym->Name << ": " << Format64Hex(v.address)); return TRUE; }
* C:\Frank\upp\theide.exe 17.09.2014 16:30:42, user: FDP ------------------------- Format64Hex(v.address) = ffffffffffffffe8 LOCAL i64: bc ------------------------- Format64Hex(v.address) = fffffffffffffff0 LOCAL d: c4 ------------------------- Format64Hex(v.address) = fffffffffffffffc LOCAL i: d0 ------------------------- Format64Hex(v.address) = 8 LOCAL app: 104 ------------------------- Format64Hex(v.address) = 8 LOCAL argc: 10 ------------------------- Format64Hex(v.address) = c LOCAL argv: 14 ------------------------- Format64Hex(v.address) = ffffffffffffffdc LOCAL mainret: 30 ------------------------- Format64Hex(v.address) = ffffffffffffffe0 LOCAL managedapp: 34 ------------------------- Format64Hex(v.address) = ffffffffffffffe4 LOCAL initret: 38
// if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGISTER) // v.address = pSym->Register; // else
pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE = 16 pSym->Register == CV_ALLREG_VFRAME = false pSym->Register = 22
BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserContext) { LocalsCtx& c = *(LocalsCtx *)UserContext; if(pSym->Tag == SymTagFunction) return TRUE; Val& v = (pSym->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER ? c.param : c.local).GetAdd(pSym->Name); v.address = (adr_t)pSym->Address; RLOG("-------------------------"); RDUMP(Format64Hex(v.address)); if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGISTER) v.address = pSym->Register; else { RDUMP(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE); RDUMP(pSym->Register == CV_ALLREG_VFRAME); RDUMP(pSym->Register); if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE) { if(true/*pSym->Register == CV_ALLREG_VFRAME*/) { #ifdef CPU_64 if(c.pdb->win64) v.address += c.pdb->GetCpuRegister(*c.context, CV_AMD64_RBP); else #endif v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP); } else v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register); RDUMP(v.address); } } if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE) { RDUMP(Format64Hex(c.frame)); v.address += c.frame; } c.pdb->TypeVal(v, pSym->TypeIndex, (adr_t)pSym->ModBase); RLOG("LOCAL " << pSym->Name << ": " << Format64Hex(v.address)); return TRUE; }
if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE) { if(pSym->Register == CV_ALLREG_VFRAME) { #ifdef CPU_64 if(c.pdb->win64) v.address += c.pdb->GetCpuRegister(*c.context, CV_AMD64_RBP); else #endif v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP); } else v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register); RDUMP(Format64Hex((adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register))); RDUMP(Format64Hex(v.address)); }
ConsoleMainFn_() Upp::AppExecute__(app=??) main(argc=0, argv=??) __tmainCRTStartup() mainCRTStartup() 76faee1c (kernel32.dll) 77ac37eb (ntdll.dll) 77ac37be (ntdll.dll)
uint64 Pdb::GetCpuRegister(const Context& ctx, int sym) { int q = GetRegisterList().Find(sym); RLOG("== GetCpuRegister ========="); RDUMP(sym); RDUMP(q); if(q < 0) return 0; const CpuRegister& r = GetRegisterList()[q]; RDUMP(r.name); RDUMP(r.kind); RDUMP(r.sym); #ifdef CPU_64 uint64 val = win64 ? GetRegister64(ctx, sym) : GetRegister32(ctx, sym); #else uint64 val = GetRegister32(ctx, sym); #endif RDUMP(Format64Hex(val)); switch(r.kind) { case REG_L: return LOBYTE(val); case REG_H: return HIBYTE(val); case REG_X: return LOWORD(val); case REG_E: return LODWORD(val); } return val; }
BOOL CALLBACK Pdb::EnumLocals(PSYMBOL_INFO pSym, ULONG SymbolSize, PVOID UserContext) { LocalsCtx& c = *(LocalsCtx *)UserContext; if(pSym->Tag == SymTagFunction) return TRUE; RLOG("=== EnumLocals ========"); RDUMP(UserContext); RDUMP(c.context); RDUMP(pSym->Register); Val& v = (pSym->Flags & IMAGEHLP_SYMBOL_INFO_PARAMETER ? c.param : c.local).GetAdd(pSym->Name); v.address = (adr_t)pSym->Address; if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGISTER) v.address = pSym->Register; else if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_REGRELATIVE) { if(pSym->Register == CV_ALLREG_VFRAME) { #ifdef CPU_64 if(c.pdb->win64) v.address += c.pdb->GetCpuRegister(*c.context, CV_AMD64_RBP); else #endif v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, CV_REG_EBP); } else v.address += (adr_t)c.pdb->GetCpuRegister(*c.context, pSym->Register); } else if(pSym->Flags & IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE) v.address += c.frame; c.pdb->TypeVal(v, pSym->TypeIndex, (adr_t)pSym->ModBase); LLOG("LOCAL " << pSym->Name << ": " << Format64Hex(v.address)); return TRUE; }
const VectorMap<int, Pdb::CpuRegister>& Pdb::GetRegisterList() { static VectorMap<int, CpuRegister> r32; ONCELOCK { #define CPU_REG(sym_, context_var, kind_, name_, flags_) { CpuRegister& r = r32.Add(sym_); r.sym = sym_; r.kind = kind_; r.name = name_; r.flags = flags_; } #include "i386.cpu" #undef CPU_REG } #ifdef CPU_64 static VectorMap<int, CpuRegister> r64; ONCELOCK { #define CPU_REG(sym_, context_var, kind_, name_, flags_) { CpuRegister& r = r64.Add(sym_); r.sym = sym_; r.kind = kind_; r.name = name_; r.flags = flags_; } #include "amd64.cpu" #undef CPU_REG } return win64 ? r64 : r32; #else return r32; #endif }
No problem at all; it's the least I can do to thank for such a great environment.
By the way: I understand you are using Upp for 64 bit windows development.
Since I got my new machine, yesterday, I wonder if the conversion from 32 bit is a smooth ride.