// context-unwind tapset // Copyright (C) 2005-2008 Red Hat Inc. // Copyright (C) 2006 Intel Corporation. // // This file is part of systemtap, and is free software. You can // redistribute it and/or modify it under the terms of the GNU General // Public License (GPL); either version 2, or (at your option) any // later version. // // Context functions provide additional information about where an event occurred. These functions can //provide information such as a backtrace to where the event occurred and the current register values for the //processor. // %{ #ifndef STP_NEED_UNWIND_DATA #define STP_NEED_UNWIND_DATA 1 #endif #ifndef STP_NEED_SYMBOL_DATA #define STP_NEED_SYMBOL_DATA 1 #endif %} /** * sfunction print_backtrace - Print stack back trace * * Equivalent to print_stack(backtrace()), * except that deeper stack nesting may be supported. Return nothing. */ function print_backtrace () %{ if (CONTEXT->regs) { _stp_stack_print(CONTEXT->regs, 1, CONTEXT->pi, MAXTRACE, NULL, NULL); } else { _stp_printf("Systemtap probe: %s\n", CONTEXT->probe_point); } %} /** * sfunction backtrace - Hex backtrace of current stack * * Return a string of hex addresses that are a backtrace of the * stack. Output may be truncated as per maximum string length. */ function backtrace:string () %{ /* pure */ if (CONTEXT->regs) _stp_stack_snprint (THIS->__retvalue, MAXSTRINGLEN, CONTEXT->regs, 0, CONTEXT->pi, MAXTRACE, NULL, NULL); else strlcpy (THIS->__retvalue, "", MAXSTRINGLEN); %} /** * sfunction task_backtrace - Hex backtrace of an arbitrary task * @task: pointer to task_struct * * Return a string of hex addresses that are a backtrace of the * stack of a particular task. Output may be truncated as per * maximum string length. */ function task_backtrace:string (task:long) %{ /* pure */ _stp_stack_snprint_tsk(THIS->__retvalue, MAXSTRINGLEN, (struct task_struct *)(unsigned long)THIS->task, 0, MAXTRACE); %} /** * sfunction caller - Return name and address of calling function * * Return the address and name of the calling function. * This is equivalent to calling: * sprintf("%s 0x%x", symname(caller_addr(), caller_addr())) * Works only for return probes at this time. */ function caller:string() { return sprintf("%s 0x%x", symname(caller_addr()), caller_addr()); } /** * sfunction caller_addr - Return caller address * * Return the address of the calling function. * Works only for return probes at this time. */ function caller_addr:long () %{ /* pure */ if (CONTEXT->pi) THIS->__retvalue = (int64_t)(long)_stp_ret_addr_r(CONTEXT->pi); else THIS->__retvalue = 0; %}