| Index: dart/runtime/vm/profiler.cc
|
| ===================================================================
|
| --- dart/runtime/vm/profiler.cc (revision 36615)
|
| +++ dart/runtime/vm/profiler.cc (working copy)
|
| @@ -21,8 +21,7 @@
|
| namespace dart {
|
|
|
|
|
| -#if defined(USING_SIMULATOR) || defined(TARGET_OS_WINDOWS) || \
|
| - defined(TARGET_OS_ANDROID)
|
| +#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID)
|
| DEFINE_FLAG(bool, profile, false, "Enable Sampling Profiler");
|
| #else
|
| DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler");
|
| @@ -1688,7 +1687,7 @@
|
| // Stack pointer should not be above frame pointer.
|
| return 1;
|
| }
|
| - intptr_t gap = original_fp_ - original_sp_;
|
| + const intptr_t gap = original_fp_ - original_sp_;
|
| if (gap >= kMaxStep) {
|
| // Gap between frame pointer and stack pointer is
|
| // too large.
|
| @@ -1699,8 +1698,19 @@
|
| // the isolates stack limit.
|
| lower_bound_ = original_sp_;
|
| }
|
| - // Store the PC marker for the top frame.
|
| - sample_->set_pc_marker(GetCurrentFramePcMarker(fp));
|
| +#if defined(TARGET_OS_WINDOWS)
|
| + // If the original_fp_ is at the beginning of a page, it may be unsafe
|
| + // to access the pc marker, because we are reading it from a different
|
| + // thread on Windows. The next page may be a guard page.
|
| + const intptr_t kPageMask = kMaxStep - 1;
|
| + bool safe_to_read_pc_marker = (original_fp_ & kPageMask) != 0;
|
| +#else
|
| + bool safe_to_read_pc_marker = true;
|
| +#endif
|
| + if (safe_to_read_pc_marker && (gap > 0)) {
|
| + // Store the PC marker for the top frame.
|
| + sample_->set_pc_marker(GetCurrentFramePcMarker(fp));
|
| + }
|
| int i = 0;
|
| for (; i < FLAG_profile_depth; i++) {
|
| if (FLAG_profile_verify_stack_walk) {
|
|
|