lcc/pylcc/guide/traceUprobe.py (24 lines of code) (raw):
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name: traceUprobe
Description :
Author : liaozhaoyan
date: 2022/10/18
-------------------------------------------------
Change Activity:
2022/10/18:
-------------------------------------------------
"""
__author__ = 'liaozhaoyan'
import time
import os
from pylcc.lbcBase import ClbcBase, CeventThread
from pylcc.lbcStack import ClbcUstack
bpfPog = r"""
#include "lbc.h"
struct data_t {
u32 c_pid;
u32 stack_id;
};
LBC_PERF_OUTPUT(e_out, struct data_t, 32);
LBC_STACK(call_stack,32);
SEC("uprobe/*")
int call_symbol(struct pt_regs *ctx)
{
struct data_t data = {};
data.c_pid = bpf_get_current_pid_tgid() >> 32;
data.stack_id = bpf_get_stackid(ctx, &call_stack, USER_STACKID_FLAGS);
bpf_perf_event_output(ctx, &e_out, BPF_F_CURRENT_CPU, &data, sizeof(data));
return 0;
}
char _license[] SEC("license") = "GPL";
"""
class CtraceUprobe(ClbcBase):
def __init__(self):
super(CtraceUprobe, self).__init__("traceUprobe", bpf_str=bpfPog, attach=0)
print(os.getpid())
# self.attachUprobes("call_symbol", -1, "/usr/bin/bash", 567408)
self.traceUprobes("call_symbol", -1, "./user:readline")
def _cb(self, cpu, e):
print("pool event cpu %d, pid:%d, stackid:%d" % (cpu, e.c_pid, e.stack_id))
stacks = self.maps['call_stack'].getArr(e.stack_id)
print(stacks)
uStack = ClbcUstack(e.c_pid, stacks)
print(uStack.dumpStacks())
def loop(self):
CeventThread(self, 'e_out', self._cb)
self.waitInterrupt()
if __name__ == "__main__":
u = CtraceUprobe()
u.loop()
pass