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. |