- Prev
- SystemTap Beginners Guide
- Next

### ⁠5.3.2. Call Graph Tracing

This section describes how to trace incoming and outgoing function calls.
para-callgraph.stp

    #! /usr/bin/env stap

    function trace(entry_p, extra) {
      %( $# > 1 %? if (tid() in trace) %)
      printf("%s%s%s %s\n",
             thread_indent (entry_p),
             (entry_p>0?"->":"<-"),
             ppfunc (),
             extra)
    }

    %( $# > 1 %?
    global trace
    probe $2.call {
      trace[tid()] = 1
    }
    probe $2.return {
      delete trace[tid()]
    }
    %)

    probe $1.call   { trace(1, $$parms) }
    probe $1.return { trace(-1, $$return) }

para-callgraph.stp takes two command-line arguments:

- The function/s whose entry/exit call you'd like to trace (`$1`).
- A second optional trigger function (`$2`), which enables or disables tracing on a per-thread basis. Tracing in each thread will continue as long as the trigger function has not exited yet.

para-callgraph.stp uses `thread_indent()`; as such, its output contains the timestamp, process name, and thread ID of `$1` (that is, the probe function you are tracing). For more information about `thread_indent()`, refer to its entry in SystemTap Functions.
The following example contains an excerpt from the output for `stap para-callgraph.stp 'kernel.function("*@fs/*.c")' 'kernel.function("sys_read")'`:
⁠

Example 5.14. para-callgraph.stp Sample Output

    [...]
       267 gnome-terminal(2921): <-do_sync_read return=0xfffffffffffffff5
       269 gnome-terminal(2921):<-vfs_read return=0xfffffffffffffff5
         0 gnome-terminal(2921):->fput file=0xffff880111eebbc0
         2 gnome-terminal(2921):<-fput
         0 gnome-terminal(2921):->fget_light fd=0x3 fput_needed=0xffff88010544df54
         3 gnome-terminal(2921):<-fget_light return=0xffff8801116ce980
         0 gnome-terminal(2921):->vfs_read file=0xffff8801116ce980 buf=0xc86504 count=0x1000 pos=0xffff88010544df48
         4 gnome-terminal(2921): ->rw_verify_area read_write=0x0 file=0xffff8801116ce980 ppos=0xffff88010544df48 count=0x1000
         7 gnome-terminal(2921): <-rw_verify_area return=0x1000
        12 gnome-terminal(2921): ->do_sync_read filp=0xffff8801116ce980 buf=0xc86504 len=0x1000 ppos=0xffff88010544df48
        15 gnome-terminal(2921): <-do_sync_read return=0xfffffffffffffff5
        18 gnome-terminal(2921):<-vfs_read return=0xfffffffffffffff5
         0 gnome-terminal(2921):->fput file=0xffff8801116ce980

- Prev5.3. Profiling
- Up
- Home
- Next5.3.3. Determining Time Spent in Kernel and User ...