• S
    tracing: Add trace_dump_stack() · 03889384
    Steven Rostedt 提交于
    I've been asked a few times about how to find out what is calling
    some location in the kernel. One way is to use dynamic function tracing
    and implement the func_stack_trace. But this only finds out who is
    calling a particular function. It does not tell you who is calling
    that function and entering a specific if conditional.
    
    I have myself implemented a quick version of trace_dump_stack() for
    this purpose a few times, and just needed it now. This is when I realized
    that this would be a good tool to have in the kernel like trace_printk().
    
    Using trace_dump_stack() is similar to dump_stack() except that it
    writes to the trace buffer instead and can be used in critical locations.
    
    For example:
    
    @@ -5485,8 +5485,12 @@ need_resched_nonpreemptible:
     	if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
     		if (unlikely(signal_pending_state(prev->state, prev)))
     			prev->state = TASK_RUNNING;
    -		else
    +		else {
     			deactivate_task(rq, prev, 1);
    +			trace_printk("Deactivating task %s:%d\n",
    +				     prev->comm, prev->pid);
    +			trace_dump_stack();
    +		}
     		switch_count = &prev->nvcsw;
     	}
    
    Produces:
    
               <...>-3249  [001]   296.105269: schedule: Deactivating task ntpd:3249
               <...>-3249  [001]   296.105270: <stack trace>
     => schedule
     => schedule_hrtimeout_range
     => poll_schedule_timeout
     => do_select
     => core_sys_select
     => sys_select
     => system_call_fastpath
    Signed-off-by: NSteven Rostedt <rostedt@goodmis.org>
    03889384
kernel.h 22.0 KB