From 74d5594c03d2f8445816b9980cd98f67e761d531 Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Fri, 12 Jan 2024 17:52:50 +0100 Subject: syz-fuzzer: add a logging RPC call Add an RPC call to post a log message to syz-manager directly from syz-fuzzer. It's very convenient during the debugging and profiling of the actual fuzzing code. --- pkg/rpctype/rpctype.go | 6 ++++++ syz-fuzzer/fuzzer.go | 15 +++++++++++++++ syz-manager/rpc.go | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/pkg/rpctype/rpctype.go b/pkg/rpctype/rpctype.go index fc582e576..3b1244662 100644 --- a/pkg/rpctype/rpctype.go +++ b/pkg/rpctype/rpctype.go @@ -200,3 +200,9 @@ type RunTestDoneArgs struct { Info []*ipc.ProgInfo Error string } + +type LogMessageReq struct { + Level int + Name string + Message string +} diff --git a/syz-fuzzer/fuzzer.go b/syz-fuzzer/fuzzer.go index ed22edde2..b3465748d 100644 --- a/syz-fuzzer/fuzzer.go +++ b/syz-fuzzer/fuzzer.go @@ -625,6 +625,21 @@ func (fuzzer *Fuzzer) checkNewCallSignal(p *prog.Prog, info *ipc.CallInfo, call return true } +// nolint: unused +// It's only needed for debugging. +func (fuzzer *Fuzzer) Logf(level int, msg string, args ...interface{}) { + go func() { + a := &rpctype.LogMessageReq{ + Level: level, + Name: fuzzer.name, + Message: fmt.Sprintf(msg, args...), + } + if err := fuzzer.manager.Call("Manager.LogMessage", a, nil); err != nil { + log.SyzFatalf("Manager.LogMessage call failed: %v", err) + } + }() +} + func setupPprofHandler(port int) { // Necessary for pprof handlers. go func() { diff --git a/syz-manager/rpc.go b/syz-manager/rpc.go index 3e946d4e9..de1fd1d43 100644 --- a/syz-manager/rpc.go +++ b/syz-manager/rpc.go @@ -396,3 +396,8 @@ func (serv *RPCServer) shutdownInstance(name string) []byte { delete(serv.fuzzers, name) return fuzzer.machineInfo } + +func (serv *RPCServer) LogMessage(m *rpctype.LogMessageReq, r *int) error { + log.Logf(m.Level, "%s: %s", m.Name, m.Message) + return nil +} -- cgit mrf-deployment