Index: runtime/vm/profiler.cc |
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc |
index 3a5dcd7583150364d961082853603762d398d828..838620ead94c88f35c61dd9281adbd13e078b46d 100644 |
--- a/runtime/vm/profiler.cc |
+++ b/runtime/vm/profiler.cc |
@@ -533,10 +533,11 @@ void PreprocessVisitor::CheckForMissingDartFrame(const Code& code, |
// PC marker is in the same code as pc, no missing frame. |
return; |
} |
- if (!ContainedInDartCodeHeaps(return_address)) { |
- // PC marker is not from the Dart heap. Do not insert. |
- return; |
- } |
+ } |
+ |
+ if (!ContainedInDartCodeHeaps(return_address)) { |
+ // return address is not from the Dart heap. Do not insert. |
+ return; |
} |
if (return_address != 0) { |
@@ -933,10 +934,16 @@ void Profiler::RecordSampleInterruptCallback( |
ASSERT(isolate != Dart::vm_isolate()); |
+ const bool exited_dart_code = (isolate->stub_code() != NULL) && |
+ (isolate->top_exit_frame_info() != 0) && |
+ (isolate->vm_tag() != VMTag::kDartTagId); |
+ const bool in_dart_code = (isolate->stub_code() != NULL) && |
+ (isolate->top_exit_frame_info() == 0) && |
+ (isolate->vm_tag() == VMTag::kDartTagId); |
+ |
uintptr_t sp = 0; |
- if ((isolate->stub_code() != NULL) && |
- (isolate->top_exit_frame_info() == 0) && |
- (isolate->vm_tag() == VMTag::kDartTagId)) { |
+ |
+ if (in_dart_code) { |
// If we're in Dart code, use the Dart stack pointer. |
sp = state.dsp; |
} else { |
@@ -1030,7 +1037,6 @@ void Profiler::RecordSampleInterruptCallback( |
CopyStackBuffer(sample); |
CopyPCMarkerIfSafe(sample); |
- // Walk the call stack. |
if (FLAG_profile_vm) { |
// Always walk the native stack collecting both native and Dart frames. |
ProfilerNativeStackWalker stackWalker(sample, |
@@ -1040,43 +1046,23 @@ void Profiler::RecordSampleInterruptCallback( |
state.fp, |
sp); |
stackWalker.walk(); |
+ } else if (exited_dart_code) { |
+ // We have a valid exit frame info, use the Dart stack walker. |
+ ProfilerDartExitStackWalker stackWalker(isolate, sample); |
+ stackWalker.walk(); |
+ } else if (in_dart_code) { |
+ // We are executing Dart code. We have frame pointers. |
+ ProfilerDartStackWalker stackWalker(isolate, |
+ sample, |
+ stack_lower, |
+ stack_upper, |
+ state.pc, |
+ state.fp, |
+ sp); |
+ stackWalker.walk(); |
} else { |
- // Attempt to walk only the Dart call stack, falling back to walking |
- // the native stack. |
- if ((isolate->stub_code() != NULL) && |
- (isolate->top_exit_frame_info() != 0) && |
- (isolate->vm_tag() != VMTag::kDartTagId)) { |
- // We have a valid exit frame info, use the Dart stack walker. |
- ProfilerDartExitStackWalker stackWalker(isolate, sample); |
- stackWalker.walk(); |
- } else if ((isolate->stub_code() != NULL) && |
- (isolate->top_exit_frame_info() == 0) && |
- (isolate->vm_tag() == VMTag::kDartTagId)) { |
- // We are executing Dart code. We have frame pointers. |
- ProfilerDartStackWalker stackWalker(isolate, |
- sample, |
- stack_lower, |
- stack_upper, |
- state.pc, |
- state.fp, |
- sp); |
- stackWalker.walk(); |
- } else { |
-#if defined(TARGET_OS_WINDOWS) && defined(TARGET_ARCH_X64) |
- // ProfilerNativeStackWalker is known to cause crashes on Win64. |
- // BUG=20423. |
- sample->set_ignore_sample(true); |
-#else |
- // Fall back to an extremely conservative stack walker. |
- ProfilerNativeStackWalker stackWalker(sample, |
- stack_lower, |
- stack_upper, |
- state.pc, |
- state.fp, |
- sp); |
- stackWalker.walk(); |
-#endif |
- } |
+ sample->set_vm_tag(VMTag::kEmbedderTagId); |
+ sample->SetAt(0, state.pc); |
} |
} |