ChangeSet ID: 21339 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/18 10:27:55
Modified files: programs/winedbg: winedbg.c symbol.c stack.c
Log message: Eric Pouech eric.pouech@wanadoo.fr Centralized calls for SymSetContext, we only do it when we change the current stack frame, and no longer every time we look up local symbols on current stack
Patch: http://cvs.winehq.org/patch.py?id=21339
Old revision New revision Changes Path 1.42 1.43 +0 -1 wine/programs/winedbg/winedbg.c 1.12 1.13 +5 -16 wine/programs/winedbg/symbol.c 1.18 1.19 +9 -7 wine/programs/winedbg/stack.c
Index: wine/programs/winedbg/winedbg.c diff -u -p wine/programs/winedbg/winedbg.c:1.42 wine/programs/winedbg/winedbg.c:1.43 --- wine/programs/winedbg/winedbg.c:1.42 18 Nov 2005 16:27:55 -0000 +++ wine/programs/winedbg/winedbg.c 18 Nov 2005 16:27:55 -0000 @@ -606,7 +606,6 @@ static unsigned dbg_exception_prolog(BOO { ADDRESS tmp = addr; /* Show where we crashed */ - stack_set_frame(0); memory_disasm_one_insn(&tmp); } source_list_from_addr(&addr, 0); Index: wine/programs/winedbg/symbol.c diff -u -p wine/programs/winedbg/symbol.c:1.12 wine/programs/winedbg/symbol.c:1.13 --- wine/programs/winedbg/symbol.c:1.12 18 Nov 2005 16:27:55 -0000 +++ wine/programs/winedbg/symbol.c 18 Nov 2005 16:27:55 -0000 @@ -209,8 +209,6 @@ enum sym_get_lval symbol_get_lvalue(cons { struct sgv_data sgv; int i = 0; - char tmp[sizeof(SYMBOL_INFO) + 256]; - SYMBOL_INFO* si = (SYMBOL_INFO*)tmp; char buffer[512]; DWORD opt; IMAGEHLP_STACK_FRAME ihsf; @@ -275,13 +273,10 @@ enum sym_get_lval symbol_get_lvalue(cons SymSetOptions(opt);
/* now grab local symbols */ - si->SizeOfStruct = sizeof(*si); - si->MaxNameLen = 256; - if (stack_get_frame(si, &ihsf) && sgv.num < NUMDBGV) + if (stack_get_current_frame(&ihsf) && sgv.num < NUMDBGV) { 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); }
if (!sgv.num) @@ -308,7 +303,7 @@ enum sym_get_lval symbol_get_lvalue(cons dbg_printf("%s %sof %s\n", sgv.syms[i].flags & SYMFLAG_PARAMETER ? "Parameter" : "Local variable", sgv.syms[i].flags & (SYMFLAG_REGISTER|SYMFLAG_REGREL) ? "(in a register) " : "", - si->Name); + name); } else if (sgv.syms[i].flags & SYMFLAG_THUNK) { @@ -353,8 +348,6 @@ enum sym_get_lval symbol_get_lvalue(cons BOOL symbol_is_local(const char* name) { struct sgv_data sgv; - char tmp[sizeof(SYMBOL_INFO) + 256]; - SYMBOL_INFO* si = (SYMBOL_INFO*)tmp; IMAGEHLP_STACK_FRAME ihsf;
sgv.num = 0; @@ -365,10 +358,7 @@ BOOL symbol_is_local(const char* name) sgv.bp_disp = FALSE; sgv.do_thunks = FALSE;
- si->SizeOfStruct = sizeof(*si); - si->MaxNameLen = 256; - if (stack_get_frame(si, &ihsf) && - SymSetContext(dbg_curr_process->handle, &ihsf, NULL)) + if (stack_get_current_frame(&ihsf)) { sgv.frame_offset = ihsf.FrameOffset; SymEnumSymbols(dbg_curr_process->handle, 0, name, sgv_cb, (void*)&sgv); @@ -613,8 +603,7 @@ int symbol_info_locals(void) if (stack_get_frame(si, &ihsf)) { dbg_printf("%s:\n", si->Name); - if (SymSetContext(dbg_curr_process->handle, &ihsf, NULL)) - SymEnumSymbols(dbg_curr_process->handle, 0, NULL, info_locals_cb, &ihsf); + SymEnumSymbols(dbg_curr_process->handle, 0, NULL, info_locals_cb, &ihsf); } return TRUE; } Index: wine/programs/winedbg/stack.c diff -u -p wine/programs/winedbg/stack.c:1.18 wine/programs/winedbg/stack.c:1.19 --- wine/programs/winedbg/stack.c:1.18 18 Nov 2005 16:27:55 -0000 +++ wine/programs/winedbg/stack.c 18 Nov 2005 16:27:55 -0000 @@ -141,8 +141,6 @@ unsigned stack_fetch_frames(void)
HeapFree(GetProcessHeap(), 0, dbg_curr_thread->frames); dbg_curr_thread->frames = NULL; - dbg_curr_thread->num_frames = 0; - dbg_curr_thread->curr_frame = 0;
memset(&sf, 0, sizeof(sf)); memory_get_current_frame(&sf.AddrFrame); @@ -168,7 +166,10 @@ unsigned stack_fetch_frames(void) /* we've probably gotten ourselves into an infinite loop so bail */ if (nf > 200) break; } - return dbg_curr_thread->num_frames = nf; + dbg_curr_thread->curr_frame = -1; + dbg_curr_thread->num_frames = nf; + stack_set_frame_internal(0); + return nf; }
struct sym_enum @@ -215,9 +216,6 @@ static void stack_print_addr_and_args(in
stack_get_frame_internal(nf, &ihsf);
- ihsf.InstructionOffset = (DWORD_PTR)memory_to_linear_addr(&dbg_curr_thread->frames[nf].addr_pc); - ihsf.FrameOffset = (DWORD_PTR)memory_to_linear_addr(&dbg_curr_thread->frames[nf].addr_frame); - /* grab module where symbol is. If we don't have a module, we cannot print more */ im.SizeOfStruct = sizeof(im); if (!SymGetModuleInfo(dbg_curr_process->handle, ihsf.InstructionOffset, &im)) @@ -258,7 +256,8 @@ static void stack_print_addr_and_args(in */ static unsigned backtrace(void) { - unsigned nf = 0; + unsigned nf = 0; + IMAGEHLP_STACK_FRAME ihsf;
dbg_printf("Backtrace:\n"); for (nf = 0; nf < dbg_curr_thread->num_frames; nf++) @@ -270,6 +269,9 @@ static unsigned backtrace(void) print_bare_address(&dbg_curr_thread->frames[nf].addr_pc); dbg_printf(")\n"); } + /* reset context to current stack frame */ + stack_get_frame_internal(dbg_curr_thread->curr_frame, &ihsf); + SymSetContext(dbg_curr_process->handle, &ihsf, NULL); return nf; }