2002-10-02 09:10:53

by Ingo Molnar

[permalink] [raw]
Subject: [patch] dump_stack() cleanup, BK-curr


i think it is quite unnecessery to dump the top portion of the stack in
dump_stack(). What matters for all these places (such as the atomic
schedule checker) is the actual backtrace - the printed stack only
contains the local variables of schedule() - not quite helpful for 99.9%
of the cases.

And yet another argument to skip the dumping of the stack: many people
have written down such dumps from screen - including the quite useless
'Stack:' information.

The attached (tested) patch modifies x86's dump_stack() to print out the
much friendlier backtrace. The patch also adds one more whitespace after
the numeric EIP value. The old dump looked this way:

bad: scheduling while atomic!
Stack: ffffffff c041c72f 0000006a 00000068 000000f0 c13e1f28 c04c49c0 c13e1f28
c02a4099 c04c49c0 000000f0 00000000 00003104 c012592e 00003104 00003104
ffffffff 34000286 00000282 00000000 00000000 c13e1f28 c04c49c0 c04c4468
Call Trace:
[<c011f009>]sys_gettimeofday+0x89/0x90
[<c0113e40>]do_page_fault+0x0/0x49e
[<c0107d63>]syscall_call+0x7/0xb

the new output is:

bad: scheduling while atomic!
Call Trace:
[<c011f009>] sys_gettimeofday+0x89/0x90
[<c0113e40>] do_page_fault+0x0/0x49e
[<c0107d63>] syscall_call+0x7/0xb

much nicer and much more compact i think.

(The stack dump can still be useful in a number of other situations, so
having it in the real oops output is still good i think.)

Ingo

--- linux/arch/i386/kernel/traps.c.orig Wed Oct 2 11:07:25 2002
+++ linux/arch/i386/kernel/traps.c Wed Oct 2 11:14:12 2002
@@ -144,7 +144,7 @@
while (((long) stack & (THREAD_SIZE-1)) != 0) {
addr = *stack++;
if (kernel_text_address(addr)) {
- printk(" [<%08lx>]", addr);
+ printk(" [<%08lx>] ", addr);
print_symbol("%s\n", addr);
}
}
@@ -189,7 +189,9 @@
*/
void dump_stack(void)
{
- show_stack(0);
+ unsigned long stack;
+
+ show_trace(&stack);
}

void show_registers(struct pt_regs *regs)


2002-10-02 14:56:02

by Martin J. Bligh

[permalink] [raw]
Subject: Re: [patch] dump_stack() cleanup, BK-curr

> void dump_stack(void)
> {
> - show_stack(0);
> + unsigned long stack;
> +
> + show_trace(&stack);
> }

Doesn't this mean that dump_stack no longer dumps the stack?
(seems somewhat counter-intuitive)

Can't code which only wants a trace just call show_trace instead?

M.

2002-10-02 16:29:53

by Daniel Phillips

[permalink] [raw]
Subject: Re: [patch] dump_stack() cleanup, BK-curr

On Wednesday 02 October 2002 11:22, Ingo Molnar wrote:
> The attached (tested) patch modifies x86's dump_stack() to print out the
> much friendlier backtrace.

How about calling it backtrace(), since that's now what it is.

--
Daniel