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

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

Issue 2680123004: VM: Teach GetAndValidateIsolateStackBounds(...) to fallback to OS thread stack bounds. (Closed)
Patch Set: Done Created 3 years, 10 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/os_thread_win.cc ('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 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 sizeof(fault_address), new_protect, &old_protect); 790 sizeof(fault_address), new_protect, &old_protect);
791 USE(success); 791 USE(success);
792 ASSERT(success); 792 ASSERT(success);
793 ASSERT(old_protect == PAGE_READWRITE); 793 ASSERT(old_protect == PAGE_READWRITE);
794 } 794 }
795 #endif 795 #endif
796 } 796 }
797 797
798 798
799 // Get |isolate|'s stack boundary and verify that |sp| and |fp| are within 799 // Get |isolate|'s stack boundary and verify that |sp| and |fp| are within
800 // it. Return |false| if anything looks suspicious. 800 // it. If |get_os_thread_bounds| is true then if |isolate| stackbounds are
801 static bool GetAndValidateIsolateStackBounds(Thread* thread, 801 // not available we fallback to using underlying OS thread bounds. This only
802 uintptr_t fp, 802 // works for the current thread.
803 uintptr_t sp, 803 // Return |false| if anything looks suspicious.
804 uword* stack_lower, 804 static bool GetAndValidateIsolateStackBounds(
Cutch 2017/02/09 16:45:24 While you're here, this could be renamed to GetAnd
Vyacheslav Egorov (Google) 2017/02/09 17:19:20 Done.
805 uword* stack_upper) { 805 Thread* thread,
806 uintptr_t fp,
807 uintptr_t sp,
808 uword* stack_lower,
809 uword* stack_upper,
810 bool get_os_thread_bounds = false) {
806 ASSERT(thread != NULL); 811 ASSERT(thread != NULL);
807 OSThread* os_thread = thread->os_thread(); 812 OSThread* os_thread = thread->os_thread();
808 ASSERT(os_thread != NULL); 813 ASSERT(os_thread != NULL);
809 ASSERT(stack_lower != NULL); 814 ASSERT(stack_lower != NULL);
810 ASSERT(stack_upper != NULL); 815 ASSERT(stack_upper != NULL);
816 ASSERT(!get_os_thread_bounds || (Thread::Current() == thread));
817
811 #if defined(USING_SIMULATOR) 818 #if defined(USING_SIMULATOR)
812 const bool in_dart_code = thread->IsExecutingDartCode(); 819 const bool use_simulator_stack_bounds = thread->IsExecutingDartCode();
813 if (in_dart_code) { 820 if (use_simulator_stack_bounds) {
814 Isolate* isolate = thread->isolate(); 821 Isolate* isolate = thread->isolate();
815 ASSERT(isolate != NULL); 822 ASSERT(isolate != NULL);
816 Simulator* simulator = isolate->simulator(); 823 Simulator* simulator = isolate->simulator();
817 *stack_lower = simulator->StackBase(); 824 *stack_lower = simulator->StackBase();
818 *stack_upper = simulator->StackTop(); 825 *stack_upper = simulator->StackTop();
819 } else if (!os_thread->GetProfilerStackBounds(stack_lower, stack_upper)) { 826 }
827 #else
828 const bool use_simulator_stack_bounds = false;
829 #endif
830
831 if (!use_simulator_stack_bounds &&
832 !os_thread->GetProfilerStackBounds(stack_lower, stack_upper) &&
833 !(get_os_thread_bounds &&
834 OSThread::GetCurrentStackBounds(stack_lower, stack_upper))) {
820 // Could not get stack boundary. 835 // Could not get stack boundary.
821 return false; 836 return false;
822 } 837 }
838
823 if ((*stack_lower == 0) || (*stack_upper == 0)) { 839 if ((*stack_lower == 0) || (*stack_upper == 0)) {
824 return false; 840 return false;
825 } 841 }
826 #else
827 if (!os_thread->GetProfilerStackBounds(stack_lower, stack_upper) ||
828 (*stack_lower == 0) || (*stack_upper == 0)) {
829 // Could not get stack boundary.
830 return false;
831 }
832 #endif
833 842
834 #if defined(TARGET_ARCH_DBC) 843 if (!use_simulator_stack_bounds && (sp > *stack_lower)) {
835 if (!in_dart_code && (sp > *stack_lower)) {
836 // The stack pointer gives us a tighter lower bound. 844 // The stack pointer gives us a tighter lower bound.
837 *stack_lower = sp; 845 *stack_lower = sp;
838 } 846 }
839 #else
840 if (sp > *stack_lower) {
841 // The stack pointer gives us a tighter lower bound.
842 *stack_lower = sp;
843 }
844 #endif
845 847
846 if (*stack_lower >= *stack_upper) { 848 if (*stack_lower >= *stack_upper) {
847 // Stack boundary is invalid. 849 // Stack boundary is invalid.
848 return false; 850 return false;
849 } 851 }
850 852
851 if ((sp < *stack_lower) || (sp >= *stack_upper)) { 853 if ((sp < *stack_lower) || (sp >= *stack_upper)) {
852 // Stack pointer is outside thread's stack boundary. 854 // Stack pointer is outside thread's stack boundary.
853 return false; 855 return false;
854 } 856 }
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 978
977 uword stack_lower = 0; 979 uword stack_lower = 0;
978 uword stack_upper = 0; 980 uword stack_upper = 0;
979 981
980 if (!InitialRegisterCheck(pc, fp, sp)) { 982 if (!InitialRegisterCheck(pc, fp, sp)) {
981 OS::PrintErr("Stack dump aborted because InitialRegisterCheck.\n"); 983 OS::PrintErr("Stack dump aborted because InitialRegisterCheck.\n");
982 return; 984 return;
983 } 985 }
984 986
985 if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower, 987 if (!GetAndValidateIsolateStackBounds(thread, fp, sp, &stack_lower,
986 &stack_upper)) { 988 &stack_upper,
989 /*get_os_thread_bounds=*/true)) {
Cutch 2017/02/09 16:45:24 I wonder why this isn't the default now?
Vyacheslav Egorov (Google) 2017/02/09 17:19:20 Because it only works if thread == Thread::Current
987 OS::PrintErr( 990 OS::PrintErr(
988 "Stack dump aborted because GetAndValidateIsolateStackBounds.\n"); 991 "Stack dump aborted because GetAndValidateIsolateStackBounds.\n");
989 return; 992 return;
990 } 993 }
991 994
992 ProfilerNativeStackWalker native_stack_walker( 995 ProfilerNativeStackWalker native_stack_walker(
993 isolate, NULL, NULL, stack_lower, stack_upper, pc, fp, sp); 996 isolate, NULL, NULL, stack_lower, stack_upper, pc, fp, sp);
994 native_stack_walker.walk(); 997 native_stack_walker.walk();
995 OS::PrintErr("-- End of DumpStackTrace\n"); 998 OS::PrintErr("-- End of DumpStackTrace\n");
996 } 999 }
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 1516
1514 1517
1515 ProcessedSampleBuffer::ProcessedSampleBuffer() 1518 ProcessedSampleBuffer::ProcessedSampleBuffer()
1516 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { 1519 : code_lookup_table_(new CodeLookupTable(Thread::Current())) {
1517 ASSERT(code_lookup_table_ != NULL); 1520 ASSERT(code_lookup_table_ != NULL);
1518 } 1521 }
1519 1522
1520 #endif // !PRODUCT 1523 #endif // !PRODUCT
1521 1524
1522 } // namespace dart 1525 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/os_thread_win.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698