Index: src/sampler.cc |
diff --git a/src/sampler.cc b/src/sampler.cc |
index 277462977d2ae68cafca1a0426edf1bdb81eee36..2b62c1a22793bd43aa342b3e87ae9fe0ddcc3690 100644 |
--- a/src/sampler.cc |
+++ b/src/sampler.cc |
@@ -59,6 +59,7 @@ |
#include "v8.h" |
+#include "frames-inl.h" |
#include "log.h" |
#include "platform.h" |
#include "simulator.h" |
@@ -641,4 +642,33 @@ void Sampler::SampleStack(TickSample* sample) { |
if (++samples_taken_ < 0) samples_taken_ = 0; |
} |
+// |
+// StackTracer implementation |
+// |
+DISABLE_ASAN void StackTracer::Trace(Isolate* isolate, TickSample* sample) { |
+ ASSERT(isolate->IsInitialized()); |
+ |
+ // Avoid collecting traces while doing GC. |
+ if (sample->state == GC) return; |
+ |
+ const Address js_entry_sp = |
+ Isolate::js_entry_sp(isolate->thread_local_top()); |
+ if (js_entry_sp == 0) { |
+ // Not executing JS now. |
+ return; |
+ } |
+ |
+ sample->external_callback = isolate->external_callback(); |
+ |
+ SafeStackTraceFrameIterator it(isolate, |
+ sample->fp, sample->sp, |
+ sample->sp, js_entry_sp); |
+ int i = 0; |
+ while (!it.done() && i < TickSample::kMaxFramesCount) { |
+ sample->stack[i++] = it.frame()->pc(); |
+ it.Advance(); |
+ } |
+ sample->frames_count = i; |
+} |
+ |
} } // namespace v8::internal |