Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(254)

Side by Side Diff: runtime/vm/profiler.cc

Issue 1837023003: Collect a single frame sample in the profiler if we can't validate stack boundaries (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/profiler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "platform/address_sanitizer.h" 5 #include "platform/address_sanitizer.h"
6 #include "platform/memory_sanitizer.h" 6 #include "platform/memory_sanitizer.h"
7 #include "platform/utils.h" 7 #include "platform/utils.h"
8 8
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/atomic.h" 10 #include "vm/atomic.h"
(...skipping 927 matching lines...) Expand 10 before | Expand all | Expand 10 after
938 } else { 938 } else {
939 // Fall back. 939 // Fall back.
940 uintptr_t pc = GetProgramCounter(); 940 uintptr_t pc = GetProgramCounter();
941 Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id()); 941 Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id());
942 sample->SetAllocationCid(cid); 942 sample->SetAllocationCid(cid);
943 sample->SetAt(0, pc); 943 sample->SetAt(0, pc);
944 } 944 }
945 } 945 }
946 946
947 947
948 void Profiler::SampleThreadSingleFrame(Thread* thread, uintptr_t pc) {
949 ASSERT(thread != NULL);
950 OSThread* os_thread = thread->os_thread();
951 ASSERT(os_thread != NULL);
952 Isolate* isolate = thread->isolate();
953
954 SampleBuffer* sample_buffer = Profiler::sample_buffer();
955 if (sample_buffer == NULL) {
956 // Profiler not initialized.
957 return;
958 }
959
960 // Setup sample.
961 Sample* sample = SetupSample(thread, sample_buffer, os_thread->trace_id());
962 // Increment counter for vm tag.
963 VMTagCounters* counters = isolate->vm_tag_counters();
964 ASSERT(counters != NULL);
965 if (thread->IsMutatorThread()) {
966 counters->Increment(sample->vm_tag());
967 }
968
969 // Write the single pc value.
970 sample->SetAt(0, pc);
971 }
972
973
948 void Profiler::SampleThread(Thread* thread, 974 void Profiler::SampleThread(Thread* thread,
949 const InterruptedThreadState& state) { 975 const InterruptedThreadState& state) {
950 ASSERT(thread != NULL); 976 ASSERT(thread != NULL);
951 OSThread* os_thread = thread->os_thread(); 977 OSThread* os_thread = thread->os_thread();
952 ASSERT(os_thread != NULL); 978 ASSERT(os_thread != NULL);
953 Isolate* isolate = thread->isolate(); 979 Isolate* isolate = thread->isolate();
954 980
955 // Thread is not doing VM work. 981 // Thread is not doing VM work.
956 if (thread->task_kind() == Thread::kUnknownTask) { 982 if (thread->task_kind() == Thread::kUnknownTask) {
957 return; 983 return;
(...skipping 24 matching lines...) Expand all
982 fp = simulator->get_register(FPREG); 1008 fp = simulator->get_register(FPREG);
983 pc = simulator->get_pc(); 1009 pc = simulator->get_pc();
984 #else 1010 #else
985 sp = state.dsp; 1011 sp = state.dsp;
986 #endif 1012 #endif
987 } else { 1013 } else {
988 // If we're in runtime code, use the C stack pointer. 1014 // If we're in runtime code, use the C stack pointer.
989 sp = state.csp; 1015 sp = state.csp;
990 } 1016 }
991 1017
992 if (!InitialRegisterCheck(pc, fp, sp)) {
993 return;
994 }
995
996 if (!CheckIsolate(isolate)) { 1018 if (!CheckIsolate(isolate)) {
997 return; 1019 return;
998 } 1020 }
999 1021
1000 if (thread->IsMutatorThread() && isolate->IsDeoptimizing()) { 1022 if (thread->IsMutatorThread() && isolate->IsDeoptimizing()) {
1023 SampleThreadSingleFrame(thread, pc);
1001 return; 1024 return;
1002 } 1025 }
1003 1026
1027 if (!InitialRegisterCheck(pc, fp, sp)) {
1028 SampleThreadSingleFrame(thread, pc);
1029 return;
1030 }
1031
1004 uword stack_lower = 0; 1032 uword stack_lower = 0;
1005 uword stack_upper = 0; 1033 uword stack_upper = 0;
1006 if (!GetAndValidateIsolateStackBounds(thread, 1034 if (!GetAndValidateIsolateStackBounds(thread,
1007 fp, 1035 fp,
1008 sp, 1036 sp,
1009 &stack_lower, 1037 &stack_lower,
1010 &stack_upper)) { 1038 &stack_upper)) {
1011 // Could not get stack boundary. 1039 // Could not get stack boundary.
1040 SampleThreadSingleFrame(thread, pc);
1012 return; 1041 return;
1013 } 1042 }
1014 1043
1015 // At this point we have a valid stack boundary for this isolate and 1044 // At this point we have a valid stack boundary for this isolate and
1016 // know that our initial stack and frame pointers are within the boundary. 1045 // know that our initial stack and frame pointers are within the boundary.
1017 SampleBuffer* sample_buffer = Profiler::sample_buffer(); 1046 SampleBuffer* sample_buffer = Profiler::sample_buffer();
1018 if (sample_buffer == NULL) { 1047 if (sample_buffer == NULL) {
1019 // Profiler not initialized. 1048 // Profiler not initialized.
1020 return; 1049 return;
1021 } 1050 }
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 1425
1397 1426
1398 ProcessedSampleBuffer::ProcessedSampleBuffer() 1427 ProcessedSampleBuffer::ProcessedSampleBuffer()
1399 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { 1428 : code_lookup_table_(new CodeLookupTable(Thread::Current())) {
1400 ASSERT(code_lookup_table_ != NULL); 1429 ASSERT(code_lookup_table_ != NULL);
1401 } 1430 }
1402 1431
1403 #endif // !PRODUCT 1432 #endif // !PRODUCT
1404 1433
1405 } // namespace dart 1434 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/profiler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698