--- /dev/null
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "os/exec"
+ "syscall"
+ "time"
+
+ sec "github.com/seccomp/libseccomp-golang"
+)
+
+func SsGetName(ss uint64) string {
+ v := sec.ScmpSyscall(ss)
+ name, err := v.GetName()
+ if err != nil {
+ panic(err)
+ }
+ return name
+}
+
+func main() {
+ fmt.Printf("Run %v\n", os.Args[1:])
+
+ cmd := exec.Command(os.Args[1], os.Args[2:]...)
+ cmd.SysProcAttr = &syscall.SysProcAttr {
+ Ptrace: true,
+ }
+ cmd.Stderr = os.Stderr
+ cmd.Stdin = os.Stdin
+ cmd.Stdout = os.Stdout
+
+ cmd.Start()
+ if err := cmd.Wait(); err != nil {
+ fmt.Printf("Wait returned: %v\n", err)
+ }
+ exit := true
+
+ time.Sleep(time.Second * 3)
+
+ pid := cmd.Process.Pid
+
+ var regs syscall.PtraceRegs
+ var ws syscall.WaitStatus
+ for {
+ if exit {
+ if err := syscall.PtraceGetRegs(pid, ®s); err != nil {
+ panic(err)
+ }
+ //time.Sleep(700 * time.Millisecond)
+ time.Sleep(time.Second)
+ fmt.Printf("%#v\n", SsGetName(regs.Orig_rax))
+ }
+
+ if err := syscall.PtraceSyscall(pid, 0); err != nil {
+ panic(err)
+ }
+
+ if _, err := syscall.Wait4(pid, &ws, 0, nil); err != nil {
+ panic(err)
+ }
+
+ if ws.Exited() {
+ fmt.Printf("Exited: %v\n", ws.ExitStatus())
+ break
+ } else if ws.Signaled() {
+ fmt.Printf("Killed by signal: %v\n", ws.Signal().String())
+ } else if ws.Stopped() {
+ fmt.Printf("Stopped by signal: %v\n", ws.StopSignal().String())
+ } else if ws.Continued() {
+ fmt.Printf("Continued\n")
+ }
+
+ exit = !exit
+ }
+}