Commit cddee29f authored by Rohit Rao's avatar Rohit Rao Committed by Commit Bot

[ios] Use a single crash key to store breadcrumbs data.

Breakpad has a 255-byte limit on the size of a single value, but will
internally split values up to 10 ways to stay under that limit.
Breadcrumbs has similar, redundant functionality, so this CL disables it
by increasing the maximum allowed value size.

BUG=1068802

Change-Id: Ibb668f7270d6f48fb62844de88789f528b323bcd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2139996Reviewed-by: default avatarEugene But <eugenebut@chromium.org>
Commit-Queue: Rohit Rao <rohitrao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#757500}
parent 29d88134
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
namespace breakpad { namespace breakpad {
// IMPORTANT: be careful if ever increasing this value, Breakpad reports have an // IMPORTANT: be careful if ever increasing this value, Breakpad reports have an
// overall size limit // overall size limit
const int kBreadcrumbsKeyCount = 6; const int kBreadcrumbsKeyCount = 1;
} }
// WebStateListObserver that allows loaded urls to be sent to the crash server. // WebStateListObserver that allows loaded urls to be sent to the crash server.
......
...@@ -27,6 +27,9 @@ extern const int kMaxProductDataLength; ...@@ -27,6 +27,9 @@ extern const int kMaxProductDataLength;
// Number of product data keys to use for breadcrumbs. // Number of product data keys to use for breadcrumbs.
@property(nonatomic) NSUInteger breadcrumbsKeyCount; @property(nonatomic) NSUInteger breadcrumbsKeyCount;
// Maximum allowed length for a single product data value.
@property(nonatomic) NSUInteger maxProductDataLength;
// Starts collecting breadcrumb events logged to |breadcrumbManager|. // Starts collecting breadcrumb events logged to |breadcrumbManager|.
- (void)observeBreadcrumbManager:(BreadcrumbManager*)breadcrumbManager; - (void)observeBreadcrumbManager:(BreadcrumbManager*)breadcrumbManager;
......
...@@ -12,8 +12,6 @@ ...@@ -12,8 +12,6 @@
#error "This file requires ARC support." #error "This file requires ARC support."
#endif #endif
const int kMaxProductDataLength = 255;
@interface CrashReporterBreadcrumbObserver () { @interface CrashReporterBreadcrumbObserver () {
// Map associating the observed BreadcrumbManager with the corresponding // Map associating the observed BreadcrumbManager with the corresponding
// observer bridge instances. // observer bridge instances.
...@@ -44,6 +42,7 @@ const int kMaxProductDataLength = 255; ...@@ -44,6 +42,7 @@ const int kMaxProductDataLength = 255;
- (instancetype)init { - (instancetype)init {
if ((self = [super init])) { if ((self = [super init])) {
_breadcrumbs = [[NSMutableString alloc] init]; _breadcrumbs = [[NSMutableString alloc] init];
_maxProductDataLength = 1530U; // 6 keys * 255 bytes/key
} }
return self; return self;
} }
...@@ -82,7 +81,7 @@ const int kMaxProductDataLength = 255; ...@@ -82,7 +81,7 @@ const int kMaxProductDataLength = 255;
[_breadcrumbs insertString:eventWithSeperator atIndex:0]; [_breadcrumbs insertString:eventWithSeperator atIndex:0];
NSUInteger maxBreadcrumbsLength = NSUInteger maxBreadcrumbsLength =
self.breadcrumbsKeyCount * kMaxProductDataLength; self.breadcrumbsKeyCount * self.maxProductDataLength;
if (_breadcrumbs.length > maxBreadcrumbsLength) { if (_breadcrumbs.length > maxBreadcrumbsLength) {
NSRange trimRange = NSMakeRange(maxBreadcrumbsLength, NSRange trimRange = NSMakeRange(maxBreadcrumbsLength,
_breadcrumbs.length - maxBreadcrumbsLength); _breadcrumbs.length - maxBreadcrumbsLength);
...@@ -93,11 +92,11 @@ const int kMaxProductDataLength = 255; ...@@ -93,11 +92,11 @@ const int kMaxProductDataLength = 255;
NSMutableArray* breadcrumbs = NSMutableArray* breadcrumbs =
[[NSMutableArray alloc] initWithCapacity:self.breadcrumbsKeyCount]; [[NSMutableArray alloc] initWithCapacity:self.breadcrumbsKeyCount];
for (NSUInteger i = 0; i < self.breadcrumbsKeyCount && for (NSUInteger i = 0; i < self.breadcrumbsKeyCount &&
(i * kMaxProductDataLength) < _breadcrumbs.length; (i * self.maxProductDataLength) < _breadcrumbs.length;
i++) { i++) {
NSUInteger location = i * kMaxProductDataLength; NSUInteger location = i * self.maxProductDataLength;
NSRange range = NSMakeRange( NSRange range = NSMakeRange(location, MIN(self.maxProductDataLength,
location, MIN(kMaxProductDataLength, _breadcrumbs.length - location)); _breadcrumbs.length - location));
[breadcrumbs addObject:[_breadcrumbs substringWithRange:range]]; [breadcrumbs addObject:[_breadcrumbs substringWithRange:range]];
} }
breakpad_helper::SetBreadcrumbEvents(breadcrumbs); breakpad_helper::SetBreadcrumbEvents(breadcrumbs);
......
...@@ -137,14 +137,17 @@ TEST_F(CrashReporterBreadcrumbObserverTest, MultipleKeysAttachedToCrashReport) { ...@@ -137,14 +137,17 @@ TEST_F(CrashReporterBreadcrumbObserverTest, MultipleKeysAttachedToCrashReport) {
chrome_browser_state_.get()); chrome_browser_state_.get());
CrashReporterBreadcrumbObserver* crash_reporter_breadcrumb_observer = CrashReporterBreadcrumbObserver* crash_reporter_breadcrumb_observer =
[[CrashReporterBreadcrumbObserver alloc] init]; [[CrashReporterBreadcrumbObserver alloc] init];
crash_reporter_breadcrumb_observer.breadcrumbsKeyCount = crash_reporter_breadcrumb_observer.breadcrumbsKeyCount = 2;
breakpad::kBreadcrumbsKeyCount;
const int max_product_data_length = 255;
crash_reporter_breadcrumb_observer.maxProductDataLength =
max_product_data_length;
[crash_reporter_breadcrumb_observer [crash_reporter_breadcrumb_observer
observeBreadcrumbManagerService:breadcrumb_service]; observeBreadcrumbManagerService:breadcrumb_service];
int time_size = strlen("00:00 "); int time_size = strlen("00:00 ");
int linebreak_size = strlen("\n"); int linebreak_size = strlen("\n");
int breadcrumb_size = kMaxProductDataLength - time_size - linebreak_size; int breadcrumb_size = max_product_data_length - time_size - linebreak_size;
std::string value1 = base::StringPrintf("%0*d", breadcrumb_size, 1); std::string value1 = base::StringPrintf("%0*d", breadcrumb_size, 1);
id validation_block1 = [OCMArg checkWithBlock:^(id value) { id validation_block1 = [OCMArg checkWithBlock:^(id value) {
EXPECT_NSEQ( EXPECT_NSEQ(
...@@ -186,12 +189,16 @@ TEST_F(CrashReporterBreadcrumbObserverTest, ProductDataOverflow) { ...@@ -186,12 +189,16 @@ TEST_F(CrashReporterBreadcrumbObserverTest, ProductDataOverflow) {
[[CrashReporterBreadcrumbObserver alloc] init]; [[CrashReporterBreadcrumbObserver alloc] init];
// Testing with 2 keys requires less code and complexity. // Testing with 2 keys requires less code and complexity.
crash_reporter_breadcrumb_observer.breadcrumbsKeyCount = 2; crash_reporter_breadcrumb_observer.breadcrumbsKeyCount = 2;
const int max_product_data_length = 255;
crash_reporter_breadcrumb_observer.maxProductDataLength =
max_product_data_length;
[crash_reporter_breadcrumb_observer [crash_reporter_breadcrumb_observer
observeBreadcrumbManagerService:breadcrumb_service]; observeBreadcrumbManagerService:breadcrumb_service];
int time_size = strlen("00:00 "); int time_size = strlen("00:00 ");
int linebreak_size = strlen("\n"); int linebreak_size = strlen("\n");
int breadcrumb_size = kMaxProductDataLength - time_size - linebreak_size; int breadcrumb_size = max_product_data_length - time_size - linebreak_size;
std::string value1 = base::StringPrintf("%0*d", breadcrumb_size, 1); std::string value1 = base::StringPrintf("%0*d", breadcrumb_size, 1);
id validation_block1 = [OCMArg checkWithBlock:^(id value) { id validation_block1 = [OCMArg checkWithBlock:^(id value) {
EXPECT_NSEQ( EXPECT_NSEQ(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment