diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-05-05 12:47:51 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-05-05 14:01:52 +0200 |
| commit | 8cbfd71747917061fa744c07972ba65a7f73a236 (patch) | |
| tree | 07cf096b58c0562084622a1e92487360aae98169 /tools | |
| parent | e42fa3fd020db0a54d0e3ecd8300a77e57fc08fd (diff) | |
tools/syz-db: implement memory benchmarking function
syz-db bench loads a corpus and measures memory consumption.
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/syz-db/syz-db.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tools/syz-db/syz-db.go b/tools/syz-db/syz-db.go index b2bd36bb0..e6cdb12ce 100644 --- a/tools/syz-db/syz-db.go +++ b/tools/syz-db/syz-db.go @@ -9,8 +9,10 @@ import ( "io/ioutil" "os" "path/filepath" + "runtime" "strconv" "strings" + "time" "github.com/google/syzkaller/pkg/db" "github.com/google/syzkaller/pkg/hash" @@ -27,6 +29,20 @@ func main() { ) flag.Parse() args := flag.Args() + if len(args) == 0 { + usage() + } + if args[0] == "bench" { + if len(args) != 2 { + usage() + } + target, err := prog.GetTarget(*flagOS, *flagArch) + if err != nil { + failf("failed to find target: %v", err) + } + bench(target, args[1]) + return + } if len(args) != 3 { usage() } @@ -52,6 +68,7 @@ func usage() { fmt.Fprintf(os.Stderr, "usage:\n") fmt.Fprintf(os.Stderr, " syz-db pack dir corpus.db\n") fmt.Fprintf(os.Stderr, " syz-db unpack corpus.db dir\n") + fmt.Fprintf(os.Stderr, " syz-db bench corpus.db\n") os.Exit(1) } @@ -113,6 +130,37 @@ func unpack(file, dir string) { } } +func bench(target *prog.Target, file string) { + start := time.Now() + db, err := db.Open(file) + if err != nil { + failf("failed to open database: %v", err) + } + var corpus []*prog.Prog + for _, rec := range db.Records { + p, err := target.Deserialize(rec.Val, prog.NonStrict) + if err != nil { + failf("failed to deserialize: %v\n%s", err, rec.Val) + } + corpus = append(corpus, p) + } + runtime.GC() + var stats runtime.MemStats + runtime.ReadMemStats(&stats) + fmt.Printf("allocs %v MB (%v M), next GC %v MB, sys heap %v MB, live allocs %v MB (%v M), time %v\n", + stats.TotalAlloc>>20, + stats.Mallocs>>20, + stats.NextGC>>20, + stats.HeapSys>>20, + stats.Alloc>>20, + (stats.Mallocs-stats.Frees)>>20, + time.Since(start)) + sink = corpus + _ = sink +} + +var sink interface{} + func failf(msg string, args ...interface{}) { fmt.Fprintf(os.Stderr, msg+"\n", args...) os.Exit(1) |
