winedbg: suppress bogus clone() frames in backtrace
Daniel Santos
daniel.santos at pobox.com
Thu Nov 26 02:25:24 CST 2015
Signed-off-by: Daniel Santos <daniel.santos at pobox.com>
---
programs/winedbg/stack.c | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/programs/winedbg/stack.c b/programs/winedbg/stack.c
index f49480a..8ef2dbc 100644
--- a/programs/winedbg/stack.c
+++ b/programs/winedbg/stack.c
@@ -307,6 +307,11 @@ static void stack_print_addr_and_args(int nf)
im.ModuleName, (DWORD_PTR)(ihsf.InstructionOffset - im.BaseOfImage));
}
+static int addr_is_nonzero(const ADDRESS64 *addr)
+{
+ return addr->Offset && (addr->Mode != AddrModeFlat || addr->Segment);
+}
+
/******************************************************************
* backtrace
*
@@ -322,12 +327,24 @@ static void backtrace(void)
dbg_curr_thread->curr_frame < dbg_curr_thread->num_frames;
dbg_curr_thread->curr_frame++)
{
- dbg_printf("%s%d ",
- (cf == dbg_curr_thread->curr_frame ? "=>" : " "),
- dbg_curr_thread->curr_frame);
- stack_print_addr_and_args(dbg_curr_thread->curr_frame);
+ const unsigned nf = dbg_curr_thread->curr_frame;
+ const ADDRESS64 *addr = &dbg_curr_thread->frames[nf].addr_frame;
+
+ /* suppress bogus clone() frames from repeating */
+ if (nf > 0
+ && !addr_is_nonzero(addr)
+ && !addr_is_nonzero(&dbg_curr_thread->frames[nf - 1u].addr_frame)
+ && !memcmp(&dbg_curr_thread->frames[nf].addr_pc,
+ &dbg_curr_thread->frames[nf - 1u].addr_pc,
+ sizeof(dbg_curr_thread->frames[nf].addr_pc)))
+ {
+ break;
+ }
+
+ dbg_printf("%s%2u ", (cf == nf ? "=>" : " "), nf);
+ stack_print_addr_and_args(nf);
dbg_printf(" (");
- print_bare_address(&dbg_curr_thread->frames[dbg_curr_thread->curr_frame].addr_frame);
+ print_bare_address(addr);
dbg_printf(")\n");
}
/* reset context to current stack frame */
--
2.5.1
More information about the wine-patches
mailing list