diff options
| author | Paul Buetow <paul@buetow.org> | 2024-02-28 01:08:12 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-02-28 01:08:12 +0200 |
| commit | 105ee65a32d8c2ab456d7b246d3e8808b07880c4 (patch) | |
| tree | 4876d7cf52edf572d93862c1dcb5c9c6d276dc11 /internal/eventloop.go | |
| parent | d44c509284eaf0db2b1f7d14ede3687ff06c4853 (diff) | |
can print out all fd syscall traces
Diffstat (limited to 'internal/eventloop.go')
| -rw-r--r-- | internal/eventloop.go | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/internal/eventloop.go b/internal/eventloop.go index d22ea62..cffb941 100644 --- a/internal/eventloop.go +++ b/internal/eventloop.go @@ -3,8 +3,6 @@ package internal import "C" import ( - "bytes" - "encoding/binary" "fmt" . "ioriotng/internal/generated/types" @@ -21,47 +19,59 @@ func (o openFile) String() string { return fmt.Sprintf("(%d) %s", o.fd, o.path) } -func binaryCompare(ev *OpenEnterEvent, raw []byte) { - buf := new(bytes.Buffer) - if err := binary.Write(buf, binary.LittleEndian, *ev); err != nil { - panic(err) - } - bytes := buf.Bytes() - fmt.Println("bytes", bytes) - fmt.Println("raw ", raw) -} - type Event interface { String() string - GetTid() uint32 + TID() uint32 + Timestamp() uint32 + Recycle() +} + +func human(enterEv, exitEv Event) string { + return fmt.Sprintf("%08d µs %s %s", + exitEv.Timestamp()-enterEv.Timestamp(), enterEv, exitEv) } func eventLoop(bpfModule *bpf.Module, ch <-chan []byte) { - type Event interface { - String() string - } + enterEvs := make(map[uint32]Event) for raw := range ch { - var ev Event + var exitEv Event + switch EventType(raw[0]) { case ENTER_OPEN_EVENT: - ev = NewOpenEnterEvent(raw) + ev := NewOpenEnterEvent(raw) + enterEvs[ev.Tid] = ev case EXIT_OPEN_EVENT: - ev = NewFdEvent(raw) + ev := NewFdEvent(raw) + if enterEv, ok := enterEvs[ev.Tid]; ok { + fmt.Println(human(enterEv, ev)) + enterEv.Recycle() + } + ev.Recycle() + case ENTER_FD_EVENT: - ev = NewFdEvent(raw) + ev := NewFdEvent(raw) + enterEvs[ev.Tid] = ev case EXIT_FD_EVENT: - ev = NewFdEvent(raw) - case ENTER_NULL_EVENT: - ev = NewNullEvent(raw) + exitEv = NewFdEvent(raw) case EXIT_NULL_EVENT: - ev = NewNullEvent(raw) + exitEv = NewNullEvent(raw) case EXIT_RET_EVENT: - ev = NewRetEvent(raw) + exitEv = NewRetEvent(raw) default: - panic("Unknown event type") + panic(fmt.Sprintf("Unknown event type %s", EventType(raw[0]))) + } + + if exitEv == nil { + continue } - fmt.Println(ev) + + if enterEv, ok := enterEvs[exitEv.TID()]; ok { + fmt.Println(human(enterEv, exitEv)) + enterEv.Recycle() + } + + exitEv.Recycle() } fmt.Println("Good bye") |
