Now returning correct symbol flags (as native does) for function pmts
& locals in dbghelp. Modified winedbg accordingly.
This commit is contained in:
parent
d389f471b6
commit
73b0e94bb3
|
@ -35,6 +35,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
|
||||||
* but those values are not directly usable from a debugger (that's why, I
|
* but those values are not directly usable from a debugger (that's why, I
|
||||||
* assume, that we have also to define constants for enum values, as
|
* assume, that we have also to define constants for enum values, as
|
||||||
* Codeview does BTW.
|
* Codeview does BTW.
|
||||||
|
* + SymEnumTypes should only return *user* defined types (UDT, typedefs...) not
|
||||||
|
* all the types stored/used in the modules (like char*)
|
||||||
* - SymGetLine{Next|Prev} don't work as expected (they don't seem to work across
|
* - SymGetLine{Next|Prev} don't work as expected (they don't seem to work across
|
||||||
* functions, and even across function blocks...). Basically, for *Next* to work
|
* functions, and even across function blocks...). Basically, for *Next* to work
|
||||||
* it requires an address after the prolog of the func (the base address of the
|
* it requires an address after the prolog of the func (the base address of the
|
||||||
|
|
|
@ -460,7 +460,7 @@ static void symt_fill_sym_info(const struct module* module,
|
||||||
case DataIsParam:
|
case DataIsParam:
|
||||||
if (data->u.s.reg_id)
|
if (data->u.s.reg_id)
|
||||||
{
|
{
|
||||||
sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_REGISTER;
|
sym_info->Flags |= SYMFLAG_REGISTER;
|
||||||
sym_info->Register = data->u.s.reg_id;
|
sym_info->Register = data->u.s.reg_id;
|
||||||
sym_info->Address = 0;
|
sym_info->Address = 0;
|
||||||
}
|
}
|
||||||
|
@ -469,10 +469,10 @@ static void symt_fill_sym_info(const struct module* module,
|
||||||
if (data->u.s.offset < 0)
|
if (data->u.s.offset < 0)
|
||||||
sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_FRAMEREL;
|
sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_FRAMEREL;
|
||||||
else
|
else
|
||||||
sym_info->Flags |= SYMFLAG_PARAMETER | SYMFLAG_FRAMEREL;
|
sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_PARAMETER | SYMFLAG_FRAMEREL;
|
||||||
/* FIXME: needed ? moreover, it's i386 dependent !!! */
|
/* FIXME: needed ? moreover, it's i386 dependent !!! */
|
||||||
sym_info->Register = CV_REG_EBP;
|
sym_info->Register = CV_REG_EBP;
|
||||||
sym_info->Address = data->u.s.offset;
|
sym_info->Address = data->u.s.offset / 8;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DataIsGlobal:
|
case DataIsGlobal:
|
||||||
|
|
|
@ -67,7 +67,8 @@ static BOOL symbol_get_debug_start(DWORD mod_base, DWORD typeid, ULONG64* start)
|
||||||
struct sgv_data
|
struct sgv_data
|
||||||
{
|
{
|
||||||
#define NUMDBGV 100
|
#define NUMDBGV 100
|
||||||
struct {
|
struct
|
||||||
|
{
|
||||||
/* FIXME: NUMDBGV should be made variable */
|
/* FIXME: NUMDBGV should be made variable */
|
||||||
struct dbg_lvalue lvalue;
|
struct dbg_lvalue lvalue;
|
||||||
DWORD flags;
|
DWORD flags;
|
||||||
|
@ -79,7 +80,7 @@ struct sgv_data
|
||||||
int lineno; /* in (opt): line number in filename where to look up symbol */
|
int lineno; /* in (opt): line number in filename where to look up symbol */
|
||||||
unsigned bp_disp : 1, /* in : whether if we take into account func address or func first displayable insn */
|
unsigned bp_disp : 1, /* in : whether if we take into account func address or func first displayable insn */
|
||||||
do_thunks : 1; /* in : whether we return thunks tags */
|
do_thunks : 1; /* in : whether we return thunks tags */
|
||||||
IMAGEHLP_STACK_FRAME ihsf; /* in : frame for local & parameter variables look up */
|
ULONG64 frame_offset; /* in : frame for local & parameter variables look up */
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
||||||
|
@ -109,15 +110,9 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
||||||
addr = (ULONG64)(DWORD_PTR)div->pval;
|
addr = (ULONG64)(DWORD_PTR)div->pval;
|
||||||
cookie = DLV_HOST;
|
cookie = DLV_HOST;
|
||||||
}
|
}
|
||||||
else if (sym->Flags & SYMFLAG_FRAMEREL)
|
else if (sym->Flags & SYMFLAG_LOCAL) /* covers both local & parameters */
|
||||||
{
|
{
|
||||||
ULONG offset;
|
addr = sgv->frame_offset + sym->Address;
|
||||||
struct dbg_type type;
|
|
||||||
|
|
||||||
type.module = sym->ModBase;
|
|
||||||
type.id = sym->TypeIndex;
|
|
||||||
types_get_info(&type, TI_GET_OFFSET, &offset);
|
|
||||||
addr = sgv->ihsf.FrameOffset + offset;
|
|
||||||
}
|
}
|
||||||
else if (sym->Flags & SYMFLAG_THUNK)
|
else if (sym->Flags & SYMFLAG_THUNK)
|
||||||
{
|
{
|
||||||
|
@ -168,13 +163,14 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
||||||
sgv->name, NUMDBGV);
|
sgv->name, NUMDBGV);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
WINE_TRACE("==> %s %s%s%s%s%s%s\n",
|
WINE_TRACE("==> %s %s%s%s%s%s%s%s\n",
|
||||||
sym->Name,
|
sym->Name,
|
||||||
(sym->Flags & SYMFLAG_FUNCTION) ? "func " : "",
|
(sym->Flags & SYMFLAG_FUNCTION) ? "func " : "",
|
||||||
(sym->Flags & SYMFLAG_FRAMEREL) ? "framerel " : "",
|
(sym->Flags & SYMFLAG_FRAMEREL) ? "framerel " : "",
|
||||||
(sym->Flags & SYMFLAG_REGISTER) ? "register " : "",
|
(sym->Flags & SYMFLAG_REGISTER) ? "register " : "",
|
||||||
(sym->Flags & SYMFLAG_REGREL) ? "regrel " : "",
|
(sym->Flags & SYMFLAG_REGREL) ? "regrel " : "",
|
||||||
(sym->Flags & SYMFLAG_PARAMETER) ? "param " : "",
|
(sym->Flags & SYMFLAG_PARAMETER) ? "param " : "",
|
||||||
|
(sym->Flags & SYMFLAG_LOCAL) ? "local " : "",
|
||||||
(sym->Flags & SYMFLAG_THUNK) ? "thunk " : "");
|
(sym->Flags & SYMFLAG_THUNK) ? "thunk " : "");
|
||||||
|
|
||||||
/* always keep the thunks at end of the array */
|
/* always keep the thunks at end of the array */
|
||||||
|
@ -217,6 +213,7 @@ enum sym_get_lval symbol_get_lvalue(const char* name, const int lineno,
|
||||||
SYMBOL_INFO* si = (SYMBOL_INFO*)tmp;
|
SYMBOL_INFO* si = (SYMBOL_INFO*)tmp;
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
DWORD opt;
|
DWORD opt;
|
||||||
|
IMAGEHLP_STACK_FRAME ihsf;
|
||||||
|
|
||||||
if (strlen(name) + 4 > sizeof(buffer))
|
if (strlen(name) + 4 > sizeof(buffer))
|
||||||
{
|
{
|
||||||
|
@ -280,9 +277,10 @@ enum sym_get_lval symbol_get_lvalue(const char* name, const int lineno,
|
||||||
/* now grab local symbols */
|
/* now grab local symbols */
|
||||||
si->SizeOfStruct = sizeof(*si);
|
si->SizeOfStruct = sizeof(*si);
|
||||||
si->MaxNameLen = 256;
|
si->MaxNameLen = 256;
|
||||||
if (stack_get_frame(si, &sgv.ihsf) && sgv.num < NUMDBGV)
|
if (stack_get_frame(si, &ihsf) && sgv.num < NUMDBGV)
|
||||||
{
|
{
|
||||||
if (SymSetContext(dbg_curr_process->handle, &sgv.ihsf, NULL))
|
sgv.frame_offset = ihsf.FrameOffset;
|
||||||
|
if (SymSetContext(dbg_curr_process->handle, &ihsf, NULL))
|
||||||
SymEnumSymbols(dbg_curr_process->handle, 0, name, sgv_cb, (void*)&sgv);
|
SymEnumSymbols(dbg_curr_process->handle, 0, name, sgv_cb, (void*)&sgv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,14 +305,9 @@ enum sym_get_lval symbol_get_lvalue(const char* name, const int lineno,
|
||||||
dbg_printf("[%d]: ", i + 1);
|
dbg_printf("[%d]: ", i + 1);
|
||||||
if (sgv.syms[i].flags & SYMFLAG_LOCAL)
|
if (sgv.syms[i].flags & SYMFLAG_LOCAL)
|
||||||
{
|
{
|
||||||
dbg_printf("local variable %sof %s\n",
|
dbg_printf("%s %sof %s\n",
|
||||||
sgv.syms[i].flags & SYMFLAG_REGISTER ? "(in a register) " : "",
|
sgv.syms[i].flags & SYMFLAG_PARAMETER ? "Parameter" : "Local variable",
|
||||||
si->Name);
|
sgv.syms[i].flags & (SYMFLAG_REGISTER|SYMFLAG_REGREL) ? "(in a register) " : "",
|
||||||
}
|
|
||||||
else if (sgv.syms[i].flags & SYMFLAG_PARAMETER)
|
|
||||||
{
|
|
||||||
dbg_printf("parameter %sof %s\n",
|
|
||||||
sgv.syms[i].flags & SYMFLAG_REGISTER ? "(in a register) " : "",
|
|
||||||
si->Name);
|
si->Name);
|
||||||
}
|
}
|
||||||
else if (sgv.syms[i].flags & SYMFLAG_THUNK)
|
else if (sgv.syms[i].flags & SYMFLAG_THUNK)
|
||||||
|
@ -362,6 +355,7 @@ BOOL symbol_is_local(const char* name)
|
||||||
struct sgv_data sgv;
|
struct sgv_data sgv;
|
||||||
char tmp[sizeof(SYMBOL_INFO) + 256];
|
char tmp[sizeof(SYMBOL_INFO) + 256];
|
||||||
SYMBOL_INFO* si = (SYMBOL_INFO*)tmp;
|
SYMBOL_INFO* si = (SYMBOL_INFO*)tmp;
|
||||||
|
IMAGEHLP_STACK_FRAME ihsf;
|
||||||
|
|
||||||
sgv.num = 0;
|
sgv.num = 0;
|
||||||
sgv.num_thunks = 0;
|
sgv.num_thunks = 0;
|
||||||
|
@ -373,9 +367,12 @@ BOOL symbol_is_local(const char* name)
|
||||||
|
|
||||||
si->SizeOfStruct = sizeof(*si);
|
si->SizeOfStruct = sizeof(*si);
|
||||||
si->MaxNameLen = 256;
|
si->MaxNameLen = 256;
|
||||||
if (stack_get_frame(si, &sgv.ihsf) &&
|
if (stack_get_frame(si, &ihsf) &&
|
||||||
SymSetContext(dbg_curr_process->handle, &sgv.ihsf, NULL))
|
SymSetContext(dbg_curr_process->handle, &ihsf, NULL))
|
||||||
|
{
|
||||||
|
sgv.frame_offset = ihsf.FrameOffset;
|
||||||
SymEnumSymbols(dbg_curr_process->handle, 0, name, sgv_cb, (void*)&sgv);
|
SymEnumSymbols(dbg_curr_process->handle, 0, name, sgv_cb, (void*)&sgv);
|
||||||
|
}
|
||||||
return sgv.num > 0;
|
return sgv.num > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -565,8 +562,8 @@ static BOOL CALLBACK info_locals_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
||||||
types_get_info(&type, TI_GET_TYPE, &type.id);
|
types_get_info(&type, TI_GET_TYPE, &type.id);
|
||||||
types_print_type(&type, FALSE);
|
types_print_type(&type, FALSE);
|
||||||
|
|
||||||
if (sym->Flags & SYMFLAG_LOCAL) explain = "local";
|
if (sym->Flags & SYMFLAG_PARAMETER) explain = "parameter";
|
||||||
else if (sym->Flags & SYMFLAG_PARAMETER) explain = "parameter";
|
else if (sym->Flags & SYMFLAG_LOCAL) explain = "local";
|
||||||
else if (sym->Flags & SYMFLAG_REGISTER) explain = buf;
|
else if (sym->Flags & SYMFLAG_REGISTER) explain = buf;
|
||||||
|
|
||||||
if (sym->Flags & SYMFLAG_REGISTER)
|
if (sym->Flags & SYMFLAG_REGISTER)
|
||||||
|
@ -589,11 +586,10 @@ static BOOL CALLBACK info_locals_cb(SYMBOL_INFO* sym, ULONG size, void* ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sym->Flags & SYMFLAG_FRAMEREL)
|
else if (sym->Flags & SYMFLAG_LOCAL)
|
||||||
{
|
{
|
||||||
type.id = sym->TypeIndex;
|
type.id = sym->TypeIndex;
|
||||||
types_get_info(&type, TI_GET_OFFSET, &v);
|
v = ((IMAGEHLP_STACK_FRAME*)ctx)->FrameOffset + sym->Address;
|
||||||
v += ((IMAGEHLP_STACK_FRAME*)ctx)->FrameOffset;
|
|
||||||
|
|
||||||
if (!dbg_read_memory((void*)v, &val, sizeof(val)))
|
if (!dbg_read_memory((void*)v, &val, sizeof(val)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,10 @@
|
||||||
* + all computations should be made on long long
|
* + all computations should be made on long long
|
||||||
* o expr computations are in int:s
|
* o expr computations are in int:s
|
||||||
* o bitfield size is on a 4-bytes
|
* o bitfield size is on a 4-bytes
|
||||||
|
* + array_index and deref should be the same function (or should share the same
|
||||||
|
* core)
|
||||||
|
* + segmented pointers are not correctly handled (and are hacked throughout the
|
||||||
|
* code by testing against itype_none)
|
||||||
* - execution:
|
* - execution:
|
||||||
* + set a better fix for gdb (proxy mode) than the step-mode hack
|
* + set a better fix for gdb (proxy mode) than the step-mode hack
|
||||||
* + implement function call in debuggee
|
* + implement function call in debuggee
|
||||||
|
|
Loading…
Reference in New Issue