Print fuzzer state at process exit. More generally, we are introducing a mechanism to print diagnostic information at fuzzer process exit time. Test: SANITIZE_TARGET="address coverage" make vts -j64 && vts-tradefed run commandAndExit vts --skip-all-system-status-check --primary-abi-only --skip-preconditions -l VERBOSE --module VtsHalLightV2_0IfaceFuzzer Change-Id: Ic5f62ab9d71571a8216a2693814e66946bc707dc
diff --git a/iface_fuzzer/ProtoFuzzerMain.cpp b/iface_fuzzer/ProtoFuzzerMain.cpp index 9aac071..f1b2c3a 100644 --- a/iface_fuzzer/ProtoFuzzerMain.cpp +++ b/iface_fuzzer/ProtoFuzzerMain.cpp
@@ -20,6 +20,7 @@ #include <unistd.h> +#include <cstdlib> #include <iostream> #include <memory> #include <string> @@ -70,6 +71,16 @@ // Odds of an enum being treated like a scalar are 1:1000. {1, 1000}}; +// Executed when fuzzer process exits. We use this to print out useful +// information about the state of the fuzzer. +static void AtExit() { + // Print currently opened interfaces. + cerr << "Currently opened interfaces: " << endl; + for (const auto &iface_desc : runner->GetOpenedIfaces()) { + cerr << iface_desc.first << endl; + } +} + extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv) { params = ExtractProtoFuzzerParams(*argc, *argv); cerr << params.DebugString() << endl; @@ -81,6 +92,8 @@ runner = make_unique<ProtoFuzzerRunner>(params.comp_specs_); runner->Init(params.target_iface_, params.binder_mode_); + // Register atexit handler after all static objects' initialization. + std::atexit(AtExit); return 0; }