Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: syzygy/agent/asan/runtime.cc

Issue 1992773002: [SyzyAsan] Enable Crashpad reporter as a 50/50 experiment. (Closed) Base URL: https://github.com/google/syzygy.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « syzygy/agent/asan/runtime.h ('k') | syzygy/agent/asan/syzyasan_rtl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 Google Inc. All Rights Reserved. 1 // Copyright 2012 Google Inc. All Rights Reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after
380 ->WriteCorruptHeapInfo(corrupt_ranges, size, buffer, error_info); \ 380 ->WriteCorruptHeapInfo(corrupt_ranges, size, buffer, error_info); \
381 } \ 381 } \
382 } 382 }
383 383
384 void LaunchMessageBox(const base::StringPiece& message) { 384 void LaunchMessageBox(const base::StringPiece& message) {
385 // TODO(chrisha): Consider making this close itself with a timeout to prevent 385 // TODO(chrisha): Consider making this close itself with a timeout to prevent
386 // hangs on the waterfall. 386 // hangs on the waterfall.
387 ::MessageBoxA(nullptr, message.data(), nullptr, MB_OK | MB_ICONEXCLAMATION); 387 ::MessageBoxA(nullptr, message.data(), nullptr, MB_OK | MB_ICONEXCLAMATION);
388 } 388 }
389 389
390 std::unique_ptr<ReporterInterface> CreateCrashReporter(AsanLogger* logger) { 390 AsanFeatureSet GenerateRandomFeatureSet() {
391 AsanFeatureSet enabled_features =
392 static_cast<AsanFeatureSet>(base::RandGenerator(ASAN_FEATURE_MAX));
393 DCHECK_LT(enabled_features, ASAN_FEATURE_MAX);
394 enabled_features &= kAsanValidFeatures;
395 return enabled_features;
396 }
397
398 std::unique_ptr<ReporterInterface> CreateCrashReporter(
399 AsanLogger* logger, AsanFeatureSet* feature_set) {
400 DCHECK_NE(static_cast<AsanLogger*>(nullptr), logger);
401 DCHECK_NE(static_cast<AsanFeatureSet*>(nullptr), feature_set);
391 std::unique_ptr<ReporterInterface> reporter; 402 std::unique_ptr<ReporterInterface> reporter;
392 403
404 bool created_crashpad = false;
405
393 // First try to grab the preferred crash reporter, overridden by the 406 // First try to grab the preferred crash reporter, overridden by the
394 // environment. 407 // environment.
395 std::unique_ptr<base::Environment> env(base::Environment::Create()); 408 std::unique_ptr<base::Environment> env(base::Environment::Create());
396 std::string reporter_name; 409 std::string reporter_name;
397 if (env->GetVar("SYZYASAN_CRASH_REPORTER", &reporter_name)) { 410 if (env->GetVar("SYZYASAN_CRASH_REPORTER", &reporter_name)) {
398 if (reporter_name == "crashpad") 411 if (reporter_name == "crashpad") {
399 reporter.reset(reporters::CrashpadReporter::Create().release()); 412 reporter.reset(reporters::CrashpadReporter::Create().release());
400 else if (reporter_name == "kasko") 413 created_crashpad = (reporter.get() != nullptr);
414 } else if (reporter_name == "kasko") {
401 reporter.reset(reporters::KaskoReporter::Create().release()); 415 reporter.reset(reporters::KaskoReporter::Create().release());
402 else if (reporter_name == "breakpad") 416 } else if (reporter_name == "breakpad") {
403 reporter.reset(reporters::BreakpadReporter::Create().release()); 417 reporter.reset(reporters::BreakpadReporter::Create().release());
418 }
404 419
405 if (reporter.get() != nullptr) { 420 if (reporter.get() != nullptr) {
406 logger->Write(base::StringPrintf( 421 logger->Write(base::StringPrintf(
407 "Using requested \"%s\" crash reporter.", reporter_name)); 422 "Using requested \"%s\" crash reporter.", reporter_name));
408 return reporter; 423 return reporter;
409 } else { 424 } else {
410 logger->Write(base::StringPrintf( 425 logger->Write(base::StringPrintf(
411 "Unable to create requested \"%s\" crash reporter.", reporter_name)); 426 "Unable to create requested \"%s\" crash reporter.", reporter_name));
412 } 427 }
413 } 428 }
414 429
415 // No crash reporter was explicitly specified, or it was unable to be 430 // No crash reporter was explicitly specified, or it was unable to be
416 // initialized. Try all of them, starting with the most recent. 431 // initialized. Try all of them, starting with the most recent.
417 432
418 // Don't try grabbing a Crashpad reporter by default, as we're not yet 433 // Only create a crashpad reporter if the feature was enabled.
419 // ready to ship this. 434 if (reporter.get() == nullptr &&
420 // TODO(chrisha): Add Crashpad support behind a feature flag. 435 (*feature_set & ASAN_FEATURE_ENABLE_CRASHPAD)) {
436 reporter.reset(reporters::CrashpadReporter::Create().release());
437 created_crashpad = (reporter.get() != nullptr);
438 }
421 439
422 // Try to initialize a Kasko crash reporter. 440 // Try to initialize a Kasko crash reporter.
423 if (reporter.get() == nullptr) 441 if (reporter.get() == nullptr)
424 reporter.reset(reporters::KaskoReporter::Create().release()); 442 reporter.reset(reporters::KaskoReporter::Create().release());
425 443
426 // If that failed then try to initialize a Breakpad reporter. 444 // If that failed then try to initialize a Breakpad reporter.
427 if (reporter.get() == nullptr) 445 if (reporter.get() == nullptr)
428 reporter.reset(reporters::BreakpadReporter::Create().release()); 446 reporter.reset(reporters::BreakpadReporter::Create().release());
429 447
448 // Ensure the feature flag (which will end up being reported as an
449 // experiment group in instrumented Chromen) reflects whether or not a
450 // crashpad reporter is in use.
451 if (created_crashpad) {
452 *feature_set |= ASAN_FEATURE_ENABLE_CRASHPAD;
453 } else {
454 *feature_set &= ~ASAN_FEATURE_ENABLE_CRASHPAD;
455 }
456
430 return reporter; 457 return reporter;
431 } 458 }
432 459
433 } // namespace 460 } // namespace
434 461
435 base::Lock AsanRuntime::lock_; 462 base::Lock AsanRuntime::lock_;
436 AsanRuntime* AsanRuntime::runtime_ = NULL; 463 AsanRuntime* AsanRuntime::runtime_ = NULL;
437 LPTOP_LEVEL_EXCEPTION_FILTER AsanRuntime::previous_uef_ = NULL; 464 LPTOP_LEVEL_EXCEPTION_FILTER AsanRuntime::previous_uef_ = NULL;
438 bool AsanRuntime::uef_installed_ = false; 465 bool AsanRuntime::uef_installed_ = false;
439 466
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 if (!SetUpMemoryNotifier()) 503 if (!SetUpMemoryNotifier())
477 return false; 504 return false;
478 if (!SetUpLogger()) 505 if (!SetUpLogger())
479 return false; 506 return false;
480 if (!SetUpStackCache()) 507 if (!SetUpStackCache())
481 return false; 508 return false;
482 if (!SetUpHeapManager()) 509 if (!SetUpHeapManager())
483 return false; 510 return false;
484 WindowsHeapAdapter::SetUp(heap_manager_.get()); 511 WindowsHeapAdapter::SetUp(heap_manager_.get());
485 512
486 if (params_.feature_randomization) { 513 AsanFeatureSet feature_set = 0;
487 AsanFeatureSet feature_set = GenerateRandomFeatureSet(); 514 if (params_.feature_randomization)
515 GenerateRandomFeatureSet();
Sigurður Ásgeirsson 2016/05/18 14:24:51 uh??
Sigurður Ásgeirsson 2016/05/18 14:26:16 That is to say - this looks like a noop to me?
chrisha 2016/05/18 14:32:57 Indeed it is. Cut and paste error. Also, as Seb p
516
517 // Creating the crash reporter may override a randomized feature, so do this
518 // before propagating paramters. The name 'disable_breakpad_reporting' is
519 // legacy; this actually means to disable all external crash reporting
520 // integration.
521 if (!params_.disable_breakpad_reporting) {
522 crash_reporter_.reset(
523 CreateCrashReporter(logger(), &feature_set).release());
524 }
525
526 // Propagate randomized features if they're enabled.
527 if (params_.feature_randomization)
488 PropagateFeatureSet(feature_set); 528 PropagateFeatureSet(feature_set);
489 }
490 529
491 // Propagates the flags values to the different modules. 530 // Propagates the flags values to the different modules.
492 PropagateParams(); 531 PropagateParams();
493 532
494 // The name 'disable_breakpad_reporting' is legacy; this actually means to
495 // disable all external crash reporting integration.
496 if (!params_.disable_breakpad_reporting)
497 crash_reporter_.reset(CreateCrashReporter(logger()).release());
498
499 // Set up the appropriate error handler depending on whether or not 533 // Set up the appropriate error handler depending on whether or not
500 // we successfully found a crash reporter. 534 // we successfully found a crash reporter.
501 if (crash_reporter_.get() != nullptr) { 535 if (crash_reporter_.get() != nullptr) {
502 logger_->Write(base::StringPrintf( 536 logger_->Write(base::StringPrintf(
503 "SyzyASAN: Using %s for error reporting.", 537 "SyzyASAN: Using %s for error reporting.",
504 crash_reporter_->GetName())); 538 crash_reporter_->GetName()));
505 SetErrorCallBack(base::Bind(&CrashReporterErrorHandler)); 539 SetErrorCallBack(base::Bind(&CrashReporterErrorHandler));
506 } else { 540 } else {
507 logger_->Write("SyzyASAN: Using default error reporting handler."); 541 logger_->Write("SyzyASAN: Using default error reporting handler.");
508 SetErrorCallBack(base::Bind(&DefaultErrorHandler)); 542 SetErrorCallBack(base::Bind(&DefaultErrorHandler));
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
954 } 988 }
955 989
956 // Print the Windbg information to display the free stack if present. 990 // Print the Windbg information to display the free stack if present.
957 if (error_info->block_info.free_stack_size != NULL) { 991 if (error_info->block_info.free_stack_size != NULL) {
958 AsanDbgMessage(L"Free stack trace:"); 992 AsanDbgMessage(L"Free stack trace:");
959 AsanDbgCmd(L"dps %p l%d", error_info->block_info.free_stack, 993 AsanDbgCmd(L"dps %p l%d", error_info->block_info.free_stack,
960 error_info->block_info.free_stack_size); 994 error_info->block_info.free_stack_size);
961 } 995 }
962 } 996 }
963 997
964 AsanFeatureSet AsanRuntime::GenerateRandomFeatureSet() {
965 AsanFeatureSet enabled_features =
966 static_cast<AsanFeatureSet>(base::RandGenerator(ASAN_FEATURE_MAX));
967 DCHECK_LT(enabled_features, ASAN_FEATURE_MAX);
968 enabled_features &= kAsanValidFeatures;
969 return enabled_features;
970 }
971
972 void AsanRuntime::PropagateFeatureSet(AsanFeatureSet feature_set) { 998 void AsanRuntime::PropagateFeatureSet(AsanFeatureSet feature_set) {
973 DCHECK_EQ(0U, feature_set & ~kAsanValidFeatures); 999 DCHECK_EQ(0U, feature_set & ~kAsanValidFeatures);
974 heap_manager_->enable_page_protections_ = 1000 heap_manager_->enable_page_protections_ =
975 (feature_set & ASAN_FEATURE_ENABLE_PAGE_PROTECTIONS) != 0; 1001 (feature_set & ASAN_FEATURE_ENABLE_PAGE_PROTECTIONS) != 0;
976 params_.enable_large_block_heap = 1002 params_.enable_large_block_heap =
977 (feature_set & ASAN_FEATURE_ENABLE_LARGE_BLOCK_HEAP) != 0; 1003 (feature_set & ASAN_FEATURE_ENABLE_LARGE_BLOCK_HEAP) != 0;
978 } 1004 }
979 1005
980 void AsanRuntime::GetBadAccessInformation(AsanErrorInfo* error_info) { 1006 void AsanRuntime::GetBadAccessInformation(AsanErrorInfo* error_info) {
981 base::AutoLock lock(lock_); 1007 base::AutoLock lock(lock_);
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 if (heap_manager_->enable_page_protections_) 1224 if (heap_manager_->enable_page_protections_)
1199 enabled_features |= ASAN_FEATURE_ENABLE_PAGE_PROTECTIONS; 1225 enabled_features |= ASAN_FEATURE_ENABLE_PAGE_PROTECTIONS;
1200 if (params_.enable_large_block_heap) 1226 if (params_.enable_large_block_heap)
1201 enabled_features |= ASAN_FEATURE_ENABLE_LARGE_BLOCK_HEAP; 1227 enabled_features |= ASAN_FEATURE_ENABLE_LARGE_BLOCK_HEAP;
1202 1228
1203 return enabled_features; 1229 return enabled_features;
1204 } 1230 }
1205 1231
1206 } // namespace asan 1232 } // namespace asan
1207 } // namespace agent 1233 } // namespace agent
OLDNEW
« no previous file with comments | « syzygy/agent/asan/runtime.h ('k') | syzygy/agent/asan/syzyasan_rtl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698