diff options
| author | Kostya Serebryany <kcc@google.com> | 2019-02-14 21:09:32 +0000 |
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2019-02-14 21:09:32 +0000 |
| commit | 1f958e7ba77a68265568cdcddc8a745f6f4f743f (patch) | |
| tree | 7fd09112be0b252f8cce9520af448beffce13713 /lib/fuzzer | |
| parent | f0a298eaf652c5f1e52db8485e90479aa0870580 (diff) | |
| download | compiler-rt-1f958e7ba77a68265568cdcddc8a745f6f4f743f.tar.gz | |
[libFuzzer] better stats for the fork mode
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@354061 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/fuzzer')
| -rw-r--r-- | lib/fuzzer/FuzzerFork.cpp | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/lib/fuzzer/FuzzerFork.cpp b/lib/fuzzer/FuzzerFork.cpp index 10fa012fa..7c82f3f04 100644 --- a/lib/fuzzer/FuzzerFork.cpp +++ b/lib/fuzzer/FuzzerFork.cpp @@ -16,12 +16,46 @@ #include "FuzzerUtil.h" #include <atomic> +#include <fstream> #include <mutex> -#include <thread> #include <queue> +#include <sstream> +#include <thread> namespace fuzzer { +struct Stats { + size_t number_of_executed_units = 0; + size_t peak_rss_mb = 0; + size_t average_exec_per_sec = 0; +}; + +static Stats ParseFinalStatsFromLog(const std::string &LogPath) { + std::ifstream In(LogPath); + std::string Line; + Stats Res; + struct { + const char *Name; + size_t *Var; + } NameVarPairs[] = { + {"stat::number_of_executed_units:", &Res.number_of_executed_units}, + {"stat::peak_rss_mb:", &Res.peak_rss_mb}, + {"stat::average_exec_per_sec:", &Res.average_exec_per_sec}, + {nullptr, nullptr}, + }; + while (std::getline(In, Line, '\n')) { + if (Line.find("stat::") != 0) continue; + std::istringstream ISS(Line); + std::string Name; + size_t Val; + ISS >> Name >> Val; + for (size_t i = 0; NameVarPairs[i].Name; i++) + if (Name == NameVarPairs[i].Name) + *NameVarPairs[i].Var = Val; + } + return Res; +} + struct FuzzJob { // Inputs. Command Cmd; @@ -43,12 +77,15 @@ struct GlobalEnv { Random *Rand; int Verbosity = 0; + size_t NumRuns = 0; + FuzzJob *CreateNewJob(size_t JobId) { Command Cmd(Args); Cmd.removeFlag("fork"); for (auto &C : CorpusDirs) // Remove all corpora from the args. Cmd.removeArgument(C); Cmd.addFlag("reload", "0"); // working in an isolated dir, no reload. + Cmd.addFlag("print_final_stats", "1"); Cmd.addFlag("max_total_time", std::to_string(std::min((size_t)300, JobId))); auto Job = new FuzzJob; @@ -95,12 +132,14 @@ struct GlobalEnv { WriteToFile(U, NewPath); Files.push_back(NewPath); } - Printf("Removing %s\n", Job->CorpusDir.c_str()); RmDirRecursive(Job->CorpusDir); Features.insert(NewFeatures.begin(), NewFeatures.end()); - Printf("INFO: temp_files: %zd files_added: %zd newft: %zd ft: %zd\n", - TempFiles.size(), FilesToAdd.size(), NewFeatures.size(), - Features.size()); + auto Stats = ParseFinalStatsFromLog(Job->LogPath); + NumRuns += Stats.number_of_executed_units; + if (!FilesToAdd.empty()) + Printf("#%zd: ft: %zd corp: %zd exec/s %zd\n", NumRuns, + Features.size(), Files.size(), + Stats.average_exec_per_sec); } }; |
