[PATCH 2/7] [WineDbg]: symbol lookup
Eric Pouech
eric.pouech at wanadoo.fr
Sat Dec 2 10:43:03 CST 2006
- remove some hassle from sgv_cb, and handle line number
displacement where needed
A+
---
programs/winedbg/symbol.c | 117 +++++++++++++++++++++++++--------------------
1 files changed, 65 insertions(+), 52 deletions(-)
diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c
index 6177437..1778208 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -32,34 +32,34 @@ #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
-static BOOL symbol_get_debug_start(DWORD mod_base, DWORD typeid, ULONG64* start)
+static BOOL symbol_get_debug_start(const struct dbg_type* func, ULONG64* start)
{
DWORD count, tag;
char buffer[sizeof(TI_FINDCHILDREN_PARAMS) + 256 * sizeof(DWORD)];
TI_FINDCHILDREN_PARAMS* fcp = (TI_FINDCHILDREN_PARAMS*)buffer;
int i;
- struct dbg_type type;
-
- if (!typeid) return FALSE; /* native dbghelp not always fills the info field */
- type.module = mod_base;
- type.id = typeid;
-
- if (!types_get_info(&type, TI_GET_CHILDRENCOUNT, &count)) return FALSE;
+ struct dbg_type child;
+
+ if (!func->id) return FALSE; /* native dbghelp not always fills the info field */
+
+ if (!types_get_info(func, TI_GET_CHILDRENCOUNT, &count)) return FALSE;
fcp->Start = 0;
while (count)
{
fcp->Count = min(count, 256);
- if (types_get_info(&type, TI_FINDCHILDREN, fcp))
+ if (types_get_info(func, TI_FINDCHILDREN, fcp))
{
for (i = 0; i < min(fcp->Count, count); i++)
{
- type.id = fcp->ChildId[i];
- types_get_info(&type, TI_GET_SYMTAG, &tag);
+ child.module = func->module;
+ child.id = fcp->ChildId[i];
+ types_get_info(&child, TI_GET_SYMTAG, &tag);
if (tag != SymTagFuncDebugStart) continue;
- return types_get_info(&type, TI_GET_ADDRESS, start);
+ return types_get_info(&child, TI_GET_ADDRESS, start);
}
count -= min(count, 256);
fcp->Start += 256;
+ fcp->Start += 256;
}
}
return FALSE;
@@ -73,13 +73,12 @@ #define NUMDBGV 100
/* FIXME: NUMDBGV should be made variable */
struct dbg_lvalue lvalue;
DWORD flags;
+ DWORD sym_info;
} syms[NUMDBGV]; /* out : will be filled in with various found symbols */
int num; /* out : number of found symbols */
int num_thunks; /* out : number of thunks found */
const char* name; /* in : name of symbol to look up */
- 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 */
- do_thunks : 1; /* in : whether we return thunks tags */
+ unsigned do_thunks : 1; /* in : whether we return thunks tags */
ULONG64 frame_offset; /* in : frame for local & parameter variables look up */
};
@@ -87,7 +86,6 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO*
{
struct sgv_data* sgv = (struct sgv_data*)ctx;
ULONG64 addr;
- IMAGEHLP_LINE il;
unsigned cookie = DLV_TARGET, insp;
if (sym->Flags & SYMFLAG_REGISTER)
@@ -114,34 +112,7 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO*
}
else
{
- DWORD disp;
- il.SizeOfStruct = sizeof(il);
- SymGetLineFromAddr(dbg_curr_process->handle, sym->Address, &disp, &il);
-
- if (sgv->lineno == -1)
- {
- if (!sgv->bp_disp ||
- !symbol_get_debug_start(sym->ModBase, sym->info, &addr))
- addr = sym->Address;
- }
- else
- {
- addr = 0;
- do
- {
- if (sgv->lineno == il.LineNumber)
- {
- addr = il.Address;
- break;
- }
- } while (SymGetLineNext(dbg_curr_process->handle, &il));
- if (!addr)
- {
- WINE_FIXME("No line (%d) found for %s (setting to symbol)\n",
- sgv->lineno, sgv->name);
- addr = sym->Address;
- }
- }
+ addr = sym->Address;
}
if (sgv->num >= NUMDBGV)
@@ -174,6 +145,7 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO*
sgv->syms[insp].lvalue.type.module = sym->ModBase;
sgv->syms[insp].lvalue.type.id = sym->TypeIndex;
sgv->syms[insp].flags = sym->Flags;
+ sgv->syms[insp].sym_info = sym->info;
sgv->num++;
return TRUE;
@@ -193,7 +165,7 @@ enum sym_get_lval symbol_get_lvalue(cons
struct dbg_lvalue* rtn, BOOL bp_disp)
{
struct sgv_data sgv;
- int i = 0;
+ int i;
char buffer[512];
DWORD opt;
IMAGEHLP_STACK_FRAME ihsf;
@@ -207,8 +179,6 @@ enum sym_get_lval symbol_get_lvalue(cons
sgv.num = 0;
sgv.num_thunks = 0;
sgv.name = &buffer[2];
- sgv.lineno = lineno;
- sgv.bp_disp = bp_disp ? TRUE : FALSE;
sgv.do_thunks = DBG_IVAR(AlwaysShowThunks);
if (strchr(name, '!'))
@@ -261,6 +231,48 @@ enum sym_get_lval symbol_get_lvalue(cons
return sglv_unknown;
}
+ /* recompute potential offsets for functions (linenumber, skip prolog) */
+ for (i = 0; i < sgv.num; i++)
+ {
+ if (sgv.syms[i].flags & (SYMFLAG_REGISTER|SYMFLAG_REGREL|SYMFLAG_LOCAL|SYMFLAG_THUNK))
+ continue;
+
+ if (lineno == -1)
+ {
+ struct dbg_type type;
+ ULONG64 addr;
+
+ type.module = sgv.syms[i].lvalue.type.module;
+ type.id = sgv.syms[i].sym_info;
+ if (bp_disp && symbol_get_debug_start(&type, &addr))
+ sgv.syms[i].lvalue.addr.Offset = addr;
+ }
+ else
+ {
+ DWORD disp;
+ IMAGEHLP_LINE il;
+ BOOL found = FALSE;
+
+ il.SizeOfStruct = sizeof(il);
+ SymGetLineFromAddr(dbg_curr_process->handle,
+ (DWORD)memory_to_linear_addr(&sgv.syms[i].lvalue.addr),
+ &disp, &il);
+ do
+ {
+ if (lineno == il.LineNumber)
+ {
+ sgv.syms[i].lvalue.addr.Offset = il.Address;
+ found = TRUE;
+ break;
+ }
+ } while (SymGetLineNext(dbg_curr_process->handle, &il));
+ if (!found)
+ WINE_FIXME("No line (%d) found for %s (setting to symbol start)\n",
+ lineno, name);
+ }
+ }
+
+ i = 0;
if (dbg_interactiveP)
{
if (sgv.num - sgv.num_thunks > 1 || /* many symbols non thunks (and showing only non thunks) */
@@ -329,8 +341,6 @@ BOOL symbol_is_local(const char* name)
sgv.num = 0;
sgv.num_thunks = 0;
sgv.name = name;
- sgv.lineno = 0;
- sgv.bp_disp = FALSE;
sgv.do_thunks = FALSE;
if (stack_get_current_frame(&ihsf))
@@ -411,6 +421,7 @@ enum dbg_line_status symbol_get_function
DWORD lin = (DWORD)memory_to_linear_addr(addr);
char buffer[sizeof(SYMBOL_INFO) + 256];
SYMBOL_INFO* sym = (SYMBOL_INFO*)buffer;
+ struct dbg_type func;
il.SizeOfStruct = sizeof(il);
sym->SizeOfStruct = sizeof(SYMBOL_INFO);
@@ -438,8 +449,12 @@ enum dbg_line_status symbol_get_function
if (!SymGetLineFromAddr(dbg_curr_process->handle, lin, &disp, &il))
return dbg_no_line_info;
- if (symbol_get_debug_start(sym->ModBase, sym->info, &start) && lin < start)
+ func.module = sym->ModBase;
+ func.id = sym->info;
+
+ if (symbol_get_debug_start(&func, &start) && lin < start)
return dbg_not_on_a_line_number;
+
if (!sym->Size) sym->Size = 0x100000;
if (il.FileName && il.FileName[0] && disp < sym->Size)
return (disp == 0) ? dbg_on_a_line_number : dbg_not_on_a_line_number;
@@ -465,8 +480,6 @@ BOOL symbol_get_line(const char* filenam
sgv.num = 0;
sgv.num_thunks = 0;
sgv.name = &buffer[2];
- sgv.lineno = -1;
- sgv.bp_disp = FALSE;
sgv.do_thunks = FALSE;
buffer[0] = '*';
More information about the wine-patches
mailing list