| Index: runtime/vm/profiler.cc
|
| diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
|
| index 83e2235f51636015c73abf847d78940388e50d31..444a5794af298c96df4cedc4fce1e47b828e44cb 100644
|
| --- a/runtime/vm/profiler.cc
|
| +++ b/runtime/vm/profiler.cc
|
| @@ -1681,6 +1681,7 @@ static void SetPCMarkerIfSafe(Sample* sample) {
|
| // the pc marker, because we are reading it from a different thread on
|
| // Windows. The marker is below fp and the previous page may be a guard
|
| // page.
|
| + COMPILE_ASSERT(kPcMarkerSlotFromFp < 0);
|
| const intptr_t kPageMask = VirtualMemory::PageSize() - 1;
|
| if ((sample->fp() & kPageMask) == 0) {
|
| return;
|
| @@ -2048,12 +2049,10 @@ void Profiler::RecordSampleInterruptCallback(
|
| sample->set_user_tag(isolate->user_tag());
|
| sample->set_sp(state.sp);
|
| sample->set_fp(state.fp);
|
| -#if !(defined(TARGET_OS_WINDOWS) && defined(TARGET_ARCH_X64))
|
| - // It is never safe to read other thread's stack unless on Win64
|
| - // other thread is inside Dart code.
|
| - SetPCMarkerIfSafe(sample);
|
| -#endif
|
| -
|
| + if (isolate->vm_tag() == VMTag::kDartTagId) {
|
| + // We should only read the PC marker when executing Dart code.
|
| + SetPCMarkerIfSafe(sample);
|
| + }
|
| // Walk the call stack.
|
| if (FLAG_profile_vm) {
|
| // Always walk the native stack collecting both native and Dart frames.
|
|
|