package main | |
import ( | |
"fmt" | |
"log" | |
"os" | |
"os/signal" | |
"github.com/iovisor/gobpf/bcc" | |
) | |
const eBPF_Program = ` | |
inline int get_arguments(struct pt_regs *ctx) { | |
void* stackAddr = (void*)ctx->sp; | |
long parameter_value; | |
bpf_probe_read(¶meter_value, sizeof(parameter_value), stackAddr+8); | |
events.perf_submit(ctx, ¶meter_value, sizeof(parameter_value)); | |
} | |
` | |
func main() { | |
bpfModule := bcc.NewModule(eBPF_Program, []string{}) | |
uprobeFd, err := bpfModule.LoadUprobe("get_arguments") | |
if err != nil { | |
log.Fatal(err) | |
} | |
err = bpfModule.AttachUprobe(os.Args[1], "main.test", uprobeFd, -1) | |
if err != nil { | |
log.Fatal(err) | |
} | |
table := bcc.NewTable(bpfModule.TableId("events"), bpfModule) | |
channel := make(chan []byte) | |
perfMap, err := bcc.InitPerfMap(table, channel) | |
if err != nil { | |
log.Fatal(err) | |
} | |
c := make(chan os.Signal, 1) | |
signal.Notify(c, os.Interrupt) | |
go func() { | |
for { | |
value := <-channel | |
fmt.Println(string(value)) | |
} | |
}() | |
perfMap.Start() | |
<-c | |
perfMap.Stop() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment