diff --git a/pkg/fuzzer/fuzzer_test.go b/pkg/fuzzer/fuzzer_test.go index 6049ac615596..145ce5c8b028 100644 --- a/pkg/fuzzer/fuzzer_test.go +++ b/pkg/fuzzer/fuzzer_test.go @@ -159,9 +159,11 @@ func (f *testFuzzer) run() { f.crashes = make(map[string]int) ctx, done := context.WithCancel(context.Background()) f.done = done + var output bytes.Buffer cfg := &rpcserver.LocalConfig{ Config: rpcserver.Config{ Config: vminfo.Config{ + Debug: true, Target: f.target, Features: flatrpc.FeatureSandboxNone, Sandbox: flatrpc.ExecEnvSandboxNone, @@ -169,15 +171,17 @@ func (f *testFuzzer) run() { Procs: 4, Slowdown: 1, }, - Executor: f.executor, - Dir: f.t.TempDir(), - Context: ctx, + Executor: f.executor, + Dir: f.t.TempDir(), + Context: ctx, + OutputWriter: &output, } cfg.MachineChecked = func(features flatrpc.Feature, syscalls map[*prog.Syscall]bool) queue.Source { cfg.Cover = true return f } if err := rpcserver.RunLocal(cfg); err != nil { + f.t.Logf("executor output:\n%s", output.String()) f.t.Fatal(err) } assert.Equal(f.t, len(f.expectedCrashes), len(f.crashes), "not all expected crashes were found") diff --git a/pkg/rpcserver/local.go b/pkg/rpcserver/local.go index e4e128dcfcc6..de6dba592a12 100644 --- a/pkg/rpcserver/local.go +++ b/pkg/rpcserver/local.go @@ -6,6 +6,7 @@ package rpcserver import ( "context" "fmt" + "io" "os" "os/exec" @@ -28,9 +29,11 @@ type LocalConfig struct { // Handle ctrl+C and exit. HandleInterrupts bool // Run executor under gdb. - GDB bool - MaxSignal []uint64 - CoverFilter []uint64 + GDB bool + // Can be used to intercept stdout/stderr output. + OutputWriter io.Writer + MaxSignal []uint64 + CoverFilter []uint64 // RunLocal exits when the context is cancelled. Context context.Context MachineChecked func(features flatrpc.Feature, syscalls map[*prog.Syscall]bool) queue.Source @@ -82,7 +85,10 @@ func RunLocal(cfg *LocalConfig) error { } cmd := exec.CommandContext(ctx, bin, args...) cmd.Dir = cfg.Dir - if cfg.Debug || cfg.GDB { + if cfg.OutputWriter != nil { + cmd.Stdout = cfg.OutputWriter + cmd.Stderr = cfg.OutputWriter + } else if cfg.Debug || cfg.GDB { cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr }