Module: wine Branch: master Commit: 1ecef8242de0027dbe38f1a2d79062ebd87f9b53 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1ecef8242de0027dbe38f1a2d7...
Author: Eric Pouech eric.pouech@orange.fr Date: Tue Jan 3 21:37:49 2012 +0100
dbghelp: When StackWalk fails to get any frame information, create a default one.
---
programs/winedbg/stack.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/programs/winedbg/stack.c b/programs/winedbg/stack.c index f6583a3..74dcc40 100644 --- a/programs/winedbg/stack.c +++ b/programs/winedbg/stack.c @@ -192,6 +192,7 @@ unsigned stack_fetch_frames(const CONTEXT* _ctx) * it to avoid any damage */ CONTEXT ctx = *_ctx; + BOOL ret;
HeapFree(GetProcessHeap(), 0, dbg_curr_thread->frames); dbg_curr_thread->frames = NULL; @@ -208,11 +209,12 @@ unsigned stack_fetch_frames(const CONTEXT* _ctx) sf.AddrFrame.Mode = AddrModeFlat; }
- while (StackWalk64(be_cpu->machine, dbg_curr_process->handle, - dbg_curr_thread->handle, &sf, &ctx, stack_read_mem, - SymFunctionTableAccess64, SymGetModuleBase64, NULL)) + while ((ret = StackWalk64(be_cpu->machine, dbg_curr_process->handle, + dbg_curr_thread->handle, &sf, &ctx, stack_read_mem, + SymFunctionTableAccess64, SymGetModuleBase64, NULL)) || + nf == 0) /* we always register first frame information */ { - dbg_curr_thread->frames = dbg_heap_realloc(dbg_curr_thread->frames, + dbg_curr_thread->frames = dbg_heap_realloc(dbg_curr_thread->frames, (nf + 1) * sizeof(dbg_curr_thread->frames[0]));
dbg_curr_thread->frames[nf].addr_pc = sf.AddrPC; @@ -230,8 +232,11 @@ unsigned stack_fetch_frames(const CONTEXT* _ctx) (dbg_curr_thread->frames[nf - 1].is_ctx_valid && memcmp(&dbg_curr_thread->frames[nf - 1].context, &ctx, sizeof(ctx)))); nf++; - /* we've probably gotten ourselves into an infinite loop so bail */ - if (nf > 200) break; + /* bail if: + * - we've (probably) gotten ourselves into an infinite loop, + * - or StackWalk failed on first frame + */ + if (nf > 200 || !ret) break; } dbg_curr_thread->curr_frame = -1; dbg_curr_thread->num_frames = nf;