[Crash Uploader] Add switch to specify crash report product name
Add an option to specify crash report product name for the crash_uploader binary. If not specified, will default to to use the original name "Eureka". Bug: 388822383 Test: build on eureka, on-device crash test Change-Id: I2b838857ffc1258996cd7a6dff8c00c3a0de89e9 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6490511 Commit-Queue: Jason Huang <hijason@google.com> Reviewed-by: Shawn Quereshi <shawnq@google.com> Reviewed-by: Yuchen Liu <yucliu@chromium.org> Cr-Commit-Position: refs/heads/main@{#1453045}
This commit is contained in:

committed by
Chromium LUCI CQ

parent
2e8d0cb5eb
commit
2d1f912b31
@ -24,6 +24,10 @@ const char kCrashServerUrl[] = "crash-server-url";
|
|||||||
// Switch to enable daemon-mode in crash_uploader.
|
// Switch to enable daemon-mode in crash_uploader.
|
||||||
const char kCrashUploaderDaemon[] = "daemon";
|
const char kCrashUploaderDaemon[] = "daemon";
|
||||||
|
|
||||||
|
// Switch to specify product name used when crash_uploader uploads crash report.
|
||||||
|
// Default to "Eureka" if not specified.
|
||||||
|
const char kCrashReportProductName[] = "product-name";
|
||||||
|
|
||||||
// Switch to disable Crash reporting
|
// Switch to disable Crash reporting
|
||||||
const char kDisableCrashReporter[] = "disable-crash-reporter";
|
const char kDisableCrashReporter[] = "disable-crash-reporter";
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ extern const char kSwitchValueFalse[];
|
|||||||
// Switches for crash_uploader
|
// Switches for crash_uploader
|
||||||
extern const char kCrashServerUrl[];
|
extern const char kCrashServerUrl[];
|
||||||
extern const char kCrashUploaderDaemon[];
|
extern const char kCrashUploaderDaemon[];
|
||||||
|
extern const char kCrashReportProductName[];
|
||||||
|
|
||||||
// Disable Crash Reporting
|
// Disable Crash Reporting
|
||||||
extern const char kDisableCrashReporter[];
|
extern const char kDisableCrashReporter[];
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
#include "base/at_exit.h"
|
#include "base/at_exit.h"
|
||||||
@ -60,7 +61,11 @@ int main(int argc, char** argv) {
|
|||||||
chromecast::GetSwitchValueBoolean(switches::kCrashUploaderDaemon, false);
|
chromecast::GetSwitchValueBoolean(switches::kCrashUploaderDaemon, false);
|
||||||
LOG_IF(INFO, daemon) << "Running crash uploader in daemon-mode";
|
LOG_IF(INFO, daemon) << "Running crash uploader in daemon-mode";
|
||||||
|
|
||||||
chromecast::MinidumpUploader uploader(sys_info.get(), server_url);
|
std::string crash_report_product_name(
|
||||||
|
command_line->GetSwitchValueASCII(switches::kCrashReportProductName));
|
||||||
|
|
||||||
|
chromecast::MinidumpUploader uploader(sys_info.get(), server_url,
|
||||||
|
crash_report_product_name);
|
||||||
do {
|
do {
|
||||||
if (!uploader.UploadAllMinidumps())
|
if (!uploader.UploadAllMinidumps())
|
||||||
LOG(ERROR) << "Failed to process minidumps";
|
LOG(ERROR) << "Failed to process minidumps";
|
||||||
|
@ -72,6 +72,7 @@ bool IsDumpObsolete(const DumpInfo& dump) {
|
|||||||
|
|
||||||
MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
|
MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
|
||||||
const std::string& server_url,
|
const std::string& server_url,
|
||||||
|
const std::string& crash_report_product_name,
|
||||||
CastCrashdumpUploader* const uploader,
|
CastCrashdumpUploader* const uploader,
|
||||||
PrefServiceGeneratorCallback callback)
|
PrefServiceGeneratorCallback callback)
|
||||||
: release_channel_(sys_info->GetSystemReleaseChannel()),
|
: release_channel_(sys_info->GetSystemReleaseChannel()),
|
||||||
@ -83,15 +84,20 @@ MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
|
|||||||
system_version_(sys_info->GetSystemBuildNumber()),
|
system_version_(sys_info->GetSystemBuildNumber()),
|
||||||
upload_location_(!server_url.empty() ? server_url
|
upload_location_(!server_url.empty() ? server_url
|
||||||
: kCrashServerProduction),
|
: kCrashServerProduction),
|
||||||
|
crash_report_product_name_(!crash_report_product_name.empty()
|
||||||
|
? crash_report_product_name
|
||||||
|
: kProductName),
|
||||||
reboot_scheduled_(false),
|
reboot_scheduled_(false),
|
||||||
filestate_initialized_(false),
|
filestate_initialized_(false),
|
||||||
uploader_(uploader),
|
uploader_(uploader),
|
||||||
pref_service_generator_(std::move(callback)) {}
|
pref_service_generator_(std::move(callback)) {}
|
||||||
|
|
||||||
MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
|
MinidumpUploader::MinidumpUploader(CastSysInfo* sys_info,
|
||||||
const std::string& server_url)
|
const std::string& server_url,
|
||||||
|
const std::string& crash_report_product_name)
|
||||||
: MinidumpUploader(sys_info,
|
: MinidumpUploader(sys_info,
|
||||||
server_url,
|
server_url,
|
||||||
|
crash_report_product_name,
|
||||||
nullptr,
|
nullptr,
|
||||||
base::BindRepeating(&CreatePrefService)) {}
|
base::BindRepeating(&CreatePrefService)) {}
|
||||||
|
|
||||||
@ -215,7 +221,7 @@ bool MinidumpUploader::DoWork() {
|
|||||||
// attempt to upload
|
// attempt to upload
|
||||||
LOG(INFO) << "Uploading crash to " << upload_location_;
|
LOG(INFO) << "Uploading crash to " << upload_location_;
|
||||||
CastCrashdumpData crashdump_data;
|
CastCrashdumpData crashdump_data;
|
||||||
crashdump_data.product = kProductName;
|
crashdump_data.product = crash_report_product_name_;
|
||||||
crashdump_data.version = GetVersionString(
|
crashdump_data.version = GetVersionString(
|
||||||
dump.params().cast_release_version, dump.params().cast_build_number);
|
dump.params().cast_release_version, dump.params().cast_build_number);
|
||||||
crashdump_data.guid = client_id;
|
crashdump_data.guid = client_id;
|
||||||
|
@ -25,9 +25,12 @@ class MinidumpUploader : public SynchronizedMinidumpManager {
|
|||||||
base::RepeatingCallback<std::unique_ptr<PrefService>()>;
|
base::RepeatingCallback<std::unique_ptr<PrefService>()>;
|
||||||
|
|
||||||
// If |server_url| is empty, a default server url will be chosen.
|
// If |server_url| is empty, a default server url will be chosen.
|
||||||
MinidumpUploader(CastSysInfo* sys_info, const std::string& server_url);
|
|
||||||
MinidumpUploader(CastSysInfo* sys_info,
|
MinidumpUploader(CastSysInfo* sys_info,
|
||||||
const std::string& server_url,
|
const std::string& server_url,
|
||||||
|
const std::string& crash_report_product_name);
|
||||||
|
MinidumpUploader(CastSysInfo* sys_info,
|
||||||
|
const std::string& server_url,
|
||||||
|
const std::string& crash_report_product_name,
|
||||||
CastCrashdumpUploader* const uploader,
|
CastCrashdumpUploader* const uploader,
|
||||||
PrefServiceGeneratorCallback callback);
|
PrefServiceGeneratorCallback callback);
|
||||||
|
|
||||||
@ -58,6 +61,11 @@ class MinidumpUploader : public SynchronizedMinidumpManager {
|
|||||||
const std::string system_version_;
|
const std::string system_version_;
|
||||||
|
|
||||||
const std::string upload_location_;
|
const std::string upload_location_;
|
||||||
|
// Not to be confused with |product_name_|, which is set to the real product
|
||||||
|
// name for the crash report, |crash_report_product_name_| should be set to
|
||||||
|
// the expected "product_name" field on go/crash to query the crash report,
|
||||||
|
// e.g. "Eureka".
|
||||||
|
const std::string crash_report_product_name_;
|
||||||
|
|
||||||
// Whether or not a reboot should be scheduled.
|
// Whether or not a reboot should be scheduled.
|
||||||
bool reboot_scheduled_;
|
bool reboot_scheduled_;
|
||||||
|
@ -158,7 +158,7 @@ TEST_F(MinidumpUploaderTest, AvoidsLockingWithoutDumps) {
|
|||||||
private:
|
private:
|
||||||
MinidumpUploader* const minidump_uploader_;
|
MinidumpUploader* const minidump_uploader_;
|
||||||
};
|
};
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
// Will lock for the first run to initialize file state.
|
// Will lock for the first run to initialize file state.
|
||||||
ASSERT_TRUE(uploader.UploadAllMinidumps());
|
ASSERT_TRUE(uploader.UploadAllMinidumps());
|
||||||
@ -173,7 +173,7 @@ TEST_F(MinidumpUploaderTest, RemovesDumpsWithoutOptIn) {
|
|||||||
|
|
||||||
// Write a dump info entry.
|
// Write a dump info entry.
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path);
|
GenerateDumpWithFiles(minidump_path, logfile_path);
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, false));
|
base::BindRepeating(&CreateFakePrefService, false));
|
||||||
|
|
||||||
// MinidumpUploader should not call upon CastCrashdumpUploader.
|
// MinidumpUploader should not call upon CastCrashdumpUploader.
|
||||||
@ -195,7 +195,7 @@ TEST_F(MinidumpUploaderTest, SavesDumpInfoWithUploadFailure) {
|
|||||||
// Write one entry with appropriate files.
|
// Write one entry with appropriate files.
|
||||||
std::unique_ptr<DumpInfo> dump(
|
std::unique_ptr<DumpInfo> dump(
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path));
|
GenerateDumpWithFiles(minidump_path, logfile_path));
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// Induce an upload failure.
|
// Induce an upload failure.
|
||||||
@ -227,7 +227,7 @@ TEST_F(MinidumpUploaderTest, SavesRemainingDumpInfoWithMidwayUploadFailure) {
|
|||||||
GenerateDumpWithFiles(minidump_path2, logfile_path2));
|
GenerateDumpWithFiles(minidump_path2, logfile_path2));
|
||||||
{
|
{
|
||||||
MinidumpUploader uploader(
|
MinidumpUploader uploader(
|
||||||
&sys_info_dummy(), "", &mock_crash_uploader(),
|
&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// First allow a successful upload, then induce failure.
|
// First allow a successful upload, then induce failure.
|
||||||
@ -257,7 +257,7 @@ TEST_F(MinidumpUploaderTest, SavesRemainingDumpInfoWithMidwayUploadFailure) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
MinidumpUploader uploader(
|
MinidumpUploader uploader(
|
||||||
&sys_info_dummy(), "", &mock_crash_uploader(),
|
&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// Finally, upload successfully.
|
// Finally, upload successfully.
|
||||||
@ -285,7 +285,7 @@ TEST_F(MinidumpUploaderTest, FailsUploadWithMissingMinidumpFile) {
|
|||||||
|
|
||||||
// Write one entry with appropriate files.
|
// Write one entry with appropriate files.
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path);
|
GenerateDumpWithFiles(minidump_path, logfile_path);
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// No CastCrashdumpUploader methods should be called.
|
// No CastCrashdumpUploader methods should be called.
|
||||||
@ -307,7 +307,7 @@ TEST_F(MinidumpUploaderTest, UploadsWithoutMissingLogFile) {
|
|||||||
|
|
||||||
// Write one entry with appropriate files.
|
// Write one entry with appropriate files.
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path);
|
GenerateDumpWithFiles(minidump_path, logfile_path);
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// Delete logfile, crash uploader should still work as intended.
|
// Delete logfile, crash uploader should still work as intended.
|
||||||
@ -333,7 +333,7 @@ TEST_F(MinidumpUploaderTest, UploadsWithMultipleAttachments) {
|
|||||||
|
|
||||||
// Write one entry with appropriate files.
|
// Write one entry with appropriate files.
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path, &attachments);
|
GenerateDumpWithFiles(minidump_path, logfile_path, &attachments);
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// Allow a successful upload.
|
// Allow a successful upload.
|
||||||
@ -377,7 +377,7 @@ TEST_F(MinidumpUploaderTest, DeletesLingeringFiles) {
|
|||||||
|
|
||||||
// Write a real entry.
|
// Write a real entry.
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path);
|
GenerateDumpWithFiles(minidump_path, logfile_path);
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
EXPECT_CALL(mock_crash_uploader(),
|
EXPECT_CALL(mock_crash_uploader(),
|
||||||
@ -402,7 +402,7 @@ TEST_F(MinidumpUploaderTest, SchedulesRebootWhenRatelimited) {
|
|||||||
const base::FilePath& minidump_path = minidump_dir_.Append("ayy");
|
const base::FilePath& minidump_path = minidump_dir_.Append("ayy");
|
||||||
const base::FilePath& logfile_path = minidump_dir_.Append("lmao");
|
const base::FilePath& logfile_path = minidump_dir_.Append("lmao");
|
||||||
|
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
// Generate max dumps.
|
// Generate max dumps.
|
||||||
for (int i = 0; i < SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps + 1;
|
for (int i = 0; i < SynchronizedMinidumpManager::kRatelimitPeriodMaxDumps + 1;
|
||||||
@ -433,7 +433,7 @@ TEST_F(MinidumpUploaderTest, SchedulesRebootWhenRatelimited) {
|
|||||||
|
|
||||||
// Generate one dump for a second pass.
|
// Generate one dump for a second pass.
|
||||||
GenerateDumpWithFiles(minidump_path, logfile_path);
|
GenerateDumpWithFiles(minidump_path, logfile_path);
|
||||||
MinidumpUploader uploader2(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader2(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
|
|
||||||
// Since a reboot was scheduled, the rate limit was cleared. New uploads
|
// Since a reboot was scheduled, the rate limit was cleared. New uploads
|
||||||
@ -455,7 +455,7 @@ TEST_F(MinidumpUploaderTest, SchedulesRebootWhenRatelimited) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(MinidumpUploaderTest, UploadInitializesFileState) {
|
TEST_F(MinidumpUploaderTest, UploadInitializesFileState) {
|
||||||
MinidumpUploader uploader(&sys_info_dummy(), "", &mock_crash_uploader(),
|
MinidumpUploader uploader(&sys_info_dummy(), "", "", &mock_crash_uploader(),
|
||||||
base::BindRepeating(&CreateFakePrefService, true));
|
base::BindRepeating(&CreateFakePrefService, true));
|
||||||
ASSERT_TRUE(base::IsDirectoryEmpty(minidump_dir_));
|
ASSERT_TRUE(base::IsDirectoryEmpty(minidump_dir_));
|
||||||
ASSERT_TRUE(uploader.UploadAllMinidumps());
|
ASSERT_TRUE(uploader.UploadAllMinidumps());
|
||||||
|
Reference in New Issue
Block a user