|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86: slightly improve stack trace on debug builds
As was rather obvious from crashes recently happening in stage testing,
the debug hypervisor, in that special case, has a drawback compared to
the non-debug one: When a call through a bad pointer happens, there's
no frame, and the top level (and frequently most important for
analysis) stack entry would get skipped:
(XEN) ----[ Xen-4.3-unstable x86_64 debug=y Not tainted ]----
(XEN) CPU: 1
(XEN) RIP: e008:[<0000000000000000>] ???
(XEN) RFLAGS: 0000000000010046 CONTEXT: hypervisor
(XEN) rax: 0000000000000008 rbx: 0000000000000001 rcx: 0000000000000003
(XEN) rdx: 0000003db54eb700 rsi: 7fffffffffffffff rdi: 0000000000000001
(XEN) rbp: ffff8302357e7ee0 rsp: ffff8302357e7e58 r8: 0000000000000000
(XEN) r9: 000000000000003e r10: ffff8302357e7f18 r11: ffff8302357e7f18
(XEN) r12: ffff8302357ee340 r13: ffff82c480263980 r14: ffff8302357ee3d0
(XEN) r15: 0000000000000001 cr0: 000000008005003b cr4: 00000000000026f0
(XEN) cr3: 00000000bf473000 cr2: 0000000000000000
(XEN) ds: 0000 es: 0000 fs: 0000 gs: 0000 ss: 0000 cs: e008
(XEN) Xen stack trace from rsp=ffff8302357e7e58:
(XEN) ffff82c4801a3d05 ffff8302357eca70 0000000800000020 ffff82c4802ead60
(XEN) 0000000000000001 ffff8302357e7ea0 ffff82c48016bf07 0000000000000000
(XEN) 0000000000000000 ffff8302357e7ee0 fffff830fffff830 0000000000000046
(XEN) ffff8302357e7f18 ffff82c480263980 ffff8302357e7f18 0000000000000000
(XEN) 0000000000000000 ffff8302357e7f10 ffff82c48015c2be 8302357dc0000fff
...
(XEN) Xen call trace:
(XEN) [<0000000000000000>] ???
(XEN) [<ffff82c48015c2be>] idle_loop+0x6c/0x7a
(XEN)
(XEN) Pagetable walk from 0000000000000000:
Since the bad pointer is being printed anyway (as part of the register
state), replace it with the top of stack value in such a case.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -217,8 +217,18 @@ static void show_trace(struct cpu_user_r
printk("Xen call trace:\n ");
- printk("[<%p>]", _p(regs->eip));
- print_symbol(" %s\n ", regs->eip);
+ addr = regs->eip;
+ while ( !is_kernel_text(addr) &&
+ (system_state > SYS_STATE_boot || !is_kernel_inittext(addr)) )
+ {
+ /* Special case when a bad pointer was called. */
+ addr ^= regs->eip ^ *ESP_BEFORE_EXCEPTION(regs);
+ if ( addr == regs->eip )
+ break;
+ }
+
+ printk("[<%p>]", _p(addr));
+ print_symbol(" %s\n ", addr);
/* Bounds for range of valid frame pointer. */
low = (unsigned long)(ESP_BEFORE_EXCEPTION(regs) - 2);
Attachment:
x86-debug-dump-TOS.patch _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |