diff options
author | Mark Wielaard <mjw@redhat.com> | 2009-04-21 17:16:51 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2009-04-21 17:16:51 +0200 |
commit | c45319065d6e3ae91ae833f7afbf0edba6c87d89 (patch) | |
tree | a5e0618ee9bea4911cac01b7df5f3ddbb6260fca /runtime/sym.c | |
parent | 6094e1992123454047c79ce724475c49e834d218 (diff) | |
download | systemtap-steved-c45319065d6e3ae91ae833f7afbf0edba6c87d89.tar.gz systemtap-steved-c45319065d6e3ae91ae833f7afbf0edba6c87d89.tar.xz systemtap-steved-c45319065d6e3ae91ae833f7afbf0edba6c87d89.zip |
Add ubacktrace(), print_ustack() and print_ubacktrace().
* runtime/sym.c (_stp_usymbol_print): New function.
* tapset/ucontext-unwind.stp (print_ubacktrace): New tapset function.
(ubacktrace): Likewise.
* tapset/ucontext-symbols.stp (print_ustack): Likewise.
* testsuite/buildok/ustack.stp: New test for above three functions.
Diffstat (limited to 'runtime/sym.c')
-rw-r--r-- | runtime/sym.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/runtime/sym.c b/runtime/sym.c index fe9b800c..013edd0c 100644 --- a/runtime/sym.c +++ b/runtime/sym.c @@ -329,6 +329,32 @@ static void _stp_symbol_print(unsigned long address) } } +/** Print an user space address from a specific task symbolically. + * @param address The address to lookup. + * @param task The address to lookup. + * @note Symbolic lookups should not normally be done within + * a probe because it is too time-consuming. Use at module exit time. + */ + +static void _stp_usymbol_print(unsigned long address, struct task_struct *task) +{ + const char *modname; + const char *name; + unsigned long offset, size; + + name = _stp_kallsyms_lookup(address, &size, &offset, &modname, NULL, + task); + + _stp_printf("%p", (int64_t) address); + + if (name) { + if (modname && *modname) + _stp_printf(" : %s+%#lx/%#lx [%s]", name, offset, size, modname); + else + _stp_printf(" : %s+%#lx/%#lx", name, offset, size); + } +} + /* Like _stp_symbol_print, except only print if the address is a valid function address */ static int _stp_func_print(unsigned long address, int verbose, int exact, struct task_struct *task) |