This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Systemtap kernel backtraces not working on 4.14.14


I have a centos installation with 4.14.14 installed. Since the systemtap that came in the box wouldn't work with that kernel, I built git HEAD. A script that calls print_syms() used to display a backtrace, but now only shows systemtap kmod symbols and one entry from the kernel proper:


  at:       8483   to: rcu_sched
 0xffffffffa0335150 : 0xffffffffa0335150 [stap_fc3e91a0b756c0a804d73b3d051959b6__1891+0xd150/0x0]  0xffffffffa0336476 : 0xffffffffa0336476 [stap_fc3e91a0b756c0a804d73b3d051959b6__1891+0xe476/0x0]  0xffffffffa0336eb4 : 0xffffffffa0336eb4 [stap_fc3e91a0b756c0a804d73b3d051959b6__1891+0xeeb4/0x0]  0xffffffffa0339ecc : 0xffffffffa0339ecc [stap_fc3e91a0b756c0a804d73b3d051959b6__1891+0x11ecc/0x0]  0xffffffffa0328014 : 0xffffffffa0328014 [stap_fc3e91a0b756c0a804d73b3d051959b6__1891+0x14/0x0]
 0xffffffff817db0a5 : __schedule+0x395/0x880 [kernel]
 0x0 : 0x0

Here is the script:


global mon, trace, header, nr_trace, start_system_time


# mon[tid()] = 1    if it's a reactor thread that we're tracing
# mon[tid()] = 0        if we don't care about this thread

# trace[tid(), idx]     multiline trace of recent events in rid()
# header[tid(), idx]    header for trace above
# nr_trace[tid()]       number of lines in trace

probe syscall.io_submit {
    if (cpu() != 7) { next }

    t = tid()
    mon[t] = 1
    start_system_time[t] = task_stime()
    ts = sprintf("%d", t)
    start_stopwatch(ts)
}

function add_trace(task_id, other_label, other_name) {
    ts = sprintf("%d", task_id)
    idx = nr_trace[task_id]++
    header[task_id, idx] = sprintf("at: %10d %s: %s", read_stopwatch_us(ts), other_label, other_name)
    trace[task_id, idx] = backtrace()
}

probe scheduler.ctxswitch {
    if (cpu() != 7) { next }

    from = prev_tid
    to = next_tid
    if (mon[from]) {
        add_trace(from, "from", next_task_name)
    }
    if (mon[to]) {
        add_trace(to, "  to", prev_task_name)
    }
}

probe syscall.io_submit.return {
    if (cpu() != 7) { next }

    t = tid()
    mon[t] = 0
    ts = sprintf("%d", t)
    tm = read_stopwatch_ms(ts)
    systime = cputime_to_msecs(task_stime() - start_system_time[t])
    if (t in nr_trace) {
        nr = nr_trace[t]
        if (tm >= 10) {
            printf("wall %6d ms sys %6d ms\n", tm, systime)
            for (idx = 0; idx != nr; ++idx) {
               printf("  %s\n", header[t, idx])
               print_syms(trace[t, idx])
            }
        }
        for (idx = 0; idx != nr; ++idx) {
           delete trace[t, idx]
           delete header[t, idx]
        }
        delete nr_trace[t]
    }
    delete_stopwatch(ts)
}


Is there something in the kernel configuration I need to turn on (.config taken from elrepo's -ml kernel)? Or a missing dependency while building systemtap? Maybe systemtap can't cope with retpolines?


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]