From 84d37160a74e0ce627a6fedf3395a7480450f4c1 Mon Sep 17 00:00:00 2001 From: Ivan Penkov Date: Mon, 5 Oct 2015 11:35:09 -0700 Subject: [PATCH] Increasing the Breakpad stack walker max scan limit from 30 to 40. Chrome started hitting some crashes in v8 jitted code which happens to be non ABI compliant and debuggers (including WinDBG) are unable to produce meaningful stack traces. The Breakpad stack walker has some builtin heuristics to deal with such cases. More specifically, when unable to find a good parent frame, it scans the raw stack to find a suitable parent frame. The max scan size was set at 30 pointers which was (apparently) not enough to recover in this case. I'm increasing it to 40 pointers. I confirmed that at 34 pointers it was able to recover however I'm setting it to 40 in order to it some slack. I needed to update two unittests which were expecting the previous scan limit. BUG= R=mark@chromium.org Review URL: https://codereview.chromium.org/1379433005 . --- src/processor/stackwalker.cc | 2 +- src/processor/stackwalker_arm64_unittest.cc | 2 +- src/processor/stackwalker_arm_unittest.cc | 2 +- src/processor/stackwalker_x86_unittest.cc | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/processor/stackwalker.cc b/src/processor/stackwalker.cc index 424cf4c4..94b66334 100644 --- a/src/processor/stackwalker.cc +++ b/src/processor/stackwalker.cc @@ -58,7 +58,7 @@ namespace google_breakpad { -const int Stackwalker::kRASearchWords = 30; +const int Stackwalker::kRASearchWords = 40; uint32_t Stackwalker::max_frames_ = 1024; bool Stackwalker::max_frames_set_ = false; diff --git a/src/processor/stackwalker_arm64_unittest.cc b/src/processor/stackwalker_arm64_unittest.cc index dd617f69..f9d18cea 100644 --- a/src/processor/stackwalker_arm64_unittest.cc +++ b/src/processor/stackwalker_arm64_unittest.cc @@ -349,7 +349,7 @@ TEST_F(GetCallerFrame, ScanFirstFrame) { .D64(0xF0000000) // more junk .D64(0x0000000D) - .Append(256, 0) // more space + .Append(336, 0) // more space .D64(return_address2) // actual return address // (won't be found) diff --git a/src/processor/stackwalker_arm_unittest.cc b/src/processor/stackwalker_arm_unittest.cc index c73322e6..8a0fd5e9 100644 --- a/src/processor/stackwalker_arm_unittest.cc +++ b/src/processor/stackwalker_arm_unittest.cc @@ -370,7 +370,7 @@ TEST_F(GetCallerFrame, ScanFirstFrame) { .D32(0xF0000000) // more junk .D32(0x0000000D) - .Append(96, 0) // more space + .Append(136, 0) // more space .D32(return_address2) // actual return address // (won't be found) diff --git a/src/processor/stackwalker_x86_unittest.cc b/src/processor/stackwalker_x86_unittest.cc index 008b496b..d4c61c8c 100644 --- a/src/processor/stackwalker_x86_unittest.cc +++ b/src/processor/stackwalker_x86_unittest.cc @@ -1228,9 +1228,9 @@ TEST_F(GetCallerFrame, WindowsFPOSystemCall) { // Scan the stack for a better return address and potentially skip frames // when the calculated return address is not in a known module. Note, that -// the span of this scan is somewhat arbitrarily limited to 120 search words -// for the context frame and 30 search words (pointers) for the other frames: -// const int kRASearchWords = 30; +// the span of this scan is somewhat arbitrarily limited to 160 search words +// for the context frame and 40 search words (pointers) for the other frames: +// const int kRASearchWords = 40; // This means that frames can be skipped only when their size is relatively // small: smaller than 4 * kRASearchWords * sizeof(InstructionType) TEST_F(GetCallerFrame, ReturnAddressIsNotInKnownModule) {