aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-01-19 13:17:24 +0100
committerDmitry Vyukov <dvyukov@google.com>2017-01-20 14:56:20 +0100
commit823604de7e37a64ddca1f3a9b5ac2d287eb2a774 (patch)
treec06e57abf23b408d475fa62e9182d7f5dc121ffb
parentc4f622fcb3a3d46a3802ec144eb60548629ef14e (diff)
syz-manager: track fuzzing time
Fuzzing time is amount of time we spent actually fuzzing. It excludes VM creation time, crash reproducing time, etc. On the other hand it is multipled by number of currently fuzzing VMs, so it can be larger than uptime time.
-rw-r--r--syz-manager/html.go1
-rw-r--r--syz-manager/manager.go11
2 files changed, 11 insertions, 1 deletions
diff --git a/syz-manager/html.go b/syz-manager/html.go
index 75d34c5e5..e9a006d07 100644
--- a/syz-manager/html.go
+++ b/syz-manager/html.go
@@ -55,6 +55,7 @@ func (mgr *Manager) httpSummary(w http.ResponseWriter, r *http.Request) {
Name: mgr.cfg.Name,
}
data.Stats = append(data.Stats, UIStat{Name: "uptime", Value: fmt.Sprint(time.Since(mgr.startTime) / 1e9 * 1e9)})
+ data.Stats = append(data.Stats, UIStat{Name: "fuzzing", Value: fmt.Sprint(mgr.fuzzingTime / 60e9 * 60e9)})
data.Stats = append(data.Stats, UIStat{Name: "corpus", Value: fmt.Sprint(len(mgr.corpus))})
data.Stats = append(data.Stats, UIStat{Name: "triage queue", Value: fmt.Sprint(len(mgr.candidates))})
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index ef079375f..ec8ac79c5 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -15,6 +15,7 @@ import (
"os/signal"
"path/filepath"
"sync"
+ "sync/atomic"
"syscall"
"time"
@@ -49,10 +50,12 @@ type Manager struct {
corpusDB *db.DB
startTime time.Time
firstConnect time.Time
+ fuzzingTime time.Duration
stats map[string]uint64
vmStop chan bool
vmChecked bool
fresh bool
+ numFuzzing uint32
mu sync.Mutex
enabledSyscalls string
@@ -192,9 +195,13 @@ func RunManager(cfg *config.Config, syscalls map[int]bool) {
}()
go func() {
- for {
+ for lastTime := time.Now(); ; {
time.Sleep(10 * time.Second)
+ now := time.Now()
+ diff := now.Sub(lastTime)
+ lastTime = now
mgr.mu.Lock()
+ mgr.fuzzingTime += diff * time.Duration(atomic.LoadUint32(&mgr.numFuzzing))
executed := mgr.stats["exec total"]
crashes := mgr.stats["crashes"]
mgr.mu.Unlock()
@@ -381,6 +388,8 @@ func (mgr *Manager) runInstance(vmCfg *vm.Config, first bool) (*Crash, error) {
// Run the fuzzer binary.
start := time.Now()
+ atomic.AddUint32(&mgr.numFuzzing, 1)
+ defer atomic.AddUint32(&mgr.numFuzzing, ^uint32(0))
cmd := fmt.Sprintf("%v -executor=%v -name=%v -manager=%v -output=%v -procs=%v -leak=%v -cover=%v -sandbox=%v -debug=%v -v=%d",
fuzzerBin, executorBin, vmCfg.Name, fwdAddr, mgr.cfg.Output, procs, leak, mgr.cfg.Cover, mgr.cfg.Sandbox, *flagDebug, fuzzerV)
outc, errc, err := inst.Run(time.Hour, mgr.vmStop, cmd)