Skip to content

Instantly share code, notes, and snippets.

@grantseltzer
Created February 17, 2020 04:48
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save grantseltzer/f82d5e2471e563f6aaf800ad9cdcf8a1 to your computer and use it in GitHub Desktop.
Save grantseltzer/f82d5e2471e563f6aaf800ad9cdcf8a1 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"log"
"os"
"os/signal"
"github.com/iovisor/gobpf/bcc"
)
const eBPF_Program = `
#include <uapi/linux/ptrace.h>
#include <linux/string.h>
BPF_PERF_OUTPUT(events);
inline int function_was_called(struct pt_regs *ctx) {
char x[29] = "Hey, the handler was called!";
events.perf_submit(ctx, &x, sizeof(x));
return 0;
}
`
func main() {
bpfModule := bcc.NewModule(eBPF_Program, []string{})
uprobeFd, err := bpfModule.LoadUprobe("function_was_called")
if err != nil {
log.Fatal(err)
}
err = bpfModule.AttachUprobe(os.Args[1], "main.handlerFunction", 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