[libFuzzer] better stats for the fork mode
llvm-svn: 354061
This commit is contained in:
parent
e8d95ad9ae
commit
8e918d6ead
|
@ -16,12 +16,46 @@
|
||||||
#include "FuzzerUtil.h"
|
#include "FuzzerUtil.h"
|
||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <fstream>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <thread>
|
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
#include <sstream>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
namespace fuzzer {
|
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 {
|
struct FuzzJob {
|
||||||
// Inputs.
|
// Inputs.
|
||||||
Command Cmd;
|
Command Cmd;
|
||||||
|
@ -43,12 +77,15 @@ struct GlobalEnv {
|
||||||
Random *Rand;
|
Random *Rand;
|
||||||
int Verbosity = 0;
|
int Verbosity = 0;
|
||||||
|
|
||||||
|
size_t NumRuns = 0;
|
||||||
|
|
||||||
FuzzJob *CreateNewJob(size_t JobId) {
|
FuzzJob *CreateNewJob(size_t JobId) {
|
||||||
Command Cmd(Args);
|
Command Cmd(Args);
|
||||||
Cmd.removeFlag("fork");
|
Cmd.removeFlag("fork");
|
||||||
for (auto &C : CorpusDirs) // Remove all corpora from the args.
|
for (auto &C : CorpusDirs) // Remove all corpora from the args.
|
||||||
Cmd.removeArgument(C);
|
Cmd.removeArgument(C);
|
||||||
Cmd.addFlag("reload", "0"); // working in an isolated dir, no reload.
|
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)));
|
Cmd.addFlag("max_total_time", std::to_string(std::min((size_t)300, JobId)));
|
||||||
|
|
||||||
auto Job = new FuzzJob;
|
auto Job = new FuzzJob;
|
||||||
|
@ -95,12 +132,14 @@ struct GlobalEnv {
|
||||||
WriteToFile(U, NewPath);
|
WriteToFile(U, NewPath);
|
||||||
Files.push_back(NewPath);
|
Files.push_back(NewPath);
|
||||||
}
|
}
|
||||||
Printf("Removing %s\n", Job->CorpusDir.c_str());
|
|
||||||
RmDirRecursive(Job->CorpusDir);
|
RmDirRecursive(Job->CorpusDir);
|
||||||
Features.insert(NewFeatures.begin(), NewFeatures.end());
|
Features.insert(NewFeatures.begin(), NewFeatures.end());
|
||||||
Printf("INFO: temp_files: %zd files_added: %zd newft: %zd ft: %zd\n",
|
auto Stats = ParseFinalStatsFromLog(Job->LogPath);
|
||||||
TempFiles.size(), FilesToAdd.size(), NewFeatures.size(),
|
NumRuns += Stats.number_of_executed_units;
|
||||||
Features.size());
|
if (!FilesToAdd.empty())
|
||||||
|
Printf("#%zd: ft: %zd corp: %zd exec/s %zd\n", NumRuns,
|
||||||
|
Features.size(), Files.size(),
|
||||||
|
Stats.average_exec_per_sec);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue