Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 868 ASSERT(isolate != NULL); | 868 ASSERT(isolate != NULL); |
| 869 Simulator* simulator = isolate->simulator(); | 869 Simulator* simulator = isolate->simulator(); |
| 870 *stack_lower = simulator->StackBase(); | 870 *stack_lower = simulator->StackBase(); |
| 871 *stack_upper = simulator->StackTop(); | 871 *stack_upper = simulator->StackTop(); |
| 872 } | 872 } |
| 873 #else | 873 #else |
| 874 const bool use_simulator_stack_bounds = false; | 874 const bool use_simulator_stack_bounds = false; |
| 875 #endif | 875 #endif |
| 876 | 876 |
| 877 if (!use_simulator_stack_bounds && | 877 if (!use_simulator_stack_bounds && |
| 878 !os_thread->GetProfilerStackBounds(stack_lower, stack_upper) && | |
| 879 !(get_os_thread_bounds && | 878 !(get_os_thread_bounds && |
| 880 OSThread::GetCurrentStackBounds(stack_lower, stack_upper))) { | 879 OSThread::GetCurrentStackBounds(stack_lower, stack_upper)) && |
| 880 !os_thread->GetProfilerStackBounds(stack_lower, stack_upper)) { | |
| 881 // Could not get stack boundary. | 881 // Could not get stack boundary. |
| 882 return false; | 882 return false; |
| 883 } | 883 } |
| 884 | 884 |
| 885 if ((*stack_lower == 0) || (*stack_upper == 0)) { | 885 if ((*stack_lower == 0) || (*stack_upper == 0)) { |
| 886 return false; | 886 return false; |
| 887 } | 887 } |
| 888 | 888 |
| 889 if (!use_simulator_stack_bounds && (sp > *stack_lower)) { | 889 if (!use_simulator_stack_bounds && (sp > *stack_lower)) { |
| 890 // The stack pointer gives us a tighter lower bound. | 890 // The stack pointer gives us a tighter lower bound. |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 962 } | 962 } |
| 963 | 963 |
| 964 | 964 |
| 965 void Profiler::DumpStackTrace(void* context) { | 965 void Profiler::DumpStackTrace(void* context) { |
| 966 #if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) | 966 #if defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) |
| 967 ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); | 967 ucontext_t* ucontext = reinterpret_cast<ucontext_t*>(context); |
| 968 mcontext_t mcontext = ucontext->uc_mcontext; | 968 mcontext_t mcontext = ucontext->uc_mcontext; |
| 969 uword pc = SignalHandler::GetProgramCounter(mcontext); | 969 uword pc = SignalHandler::GetProgramCounter(mcontext); |
| 970 uword fp = SignalHandler::GetFramePointer(mcontext); | 970 uword fp = SignalHandler::GetFramePointer(mcontext); |
| 971 uword sp = SignalHandler::GetCStackPointer(mcontext); | 971 uword sp = SignalHandler::GetCStackPointer(mcontext); |
| 972 DumpStackTrace(sp, fp, pc); | 972 DumpStackTrace(sp, fp, pc, true /* for_crash */); |
| 973 #else | 973 #else |
| 974 // TODO(fschneider): Add support for more platforms. | 974 // TODO(fschneider): Add support for more platforms. |
| 975 // Do nothing on unsupported platforms. | 975 // Do nothing on unsupported platforms. |
| 976 #endif | 976 #endif |
| 977 } | 977 } |
| 978 | 978 |
| 979 | 979 |
| 980 void Profiler::DumpStackTrace() { | 980 void Profiler::DumpStackTrace(bool for_crash) { |
| 981 uintptr_t sp = Thread::GetCurrentStackPointer(); | 981 uintptr_t sp = Thread::GetCurrentStackPointer(); |
| 982 uintptr_t fp = 0; | 982 uintptr_t fp = 0; |
| 983 uintptr_t pc = OS::GetProgramCounter(); | 983 uintptr_t pc = OS::GetProgramCounter(); |
| 984 | 984 |
| 985 COPY_FP_REGISTER(fp); | 985 COPY_FP_REGISTER(fp); |
| 986 | 986 |
| 987 DumpStackTrace(sp, fp, pc); | 987 DumpStackTrace(sp, fp, pc, for_crash); |
| 988 } | 988 } |
| 989 | 989 |
| 990 | 990 |
| 991 void Profiler::DumpStackTrace(uword sp, uword fp, uword pc) { | 991 void Profiler::DumpStackTrace(uword sp, uword fp, uword pc, bool for_crash) { |
| 992 // Allow only one stack trace to prevent recursively printing stack traces if | 992 if (for_crash) { |
| 993 // we hit an assert while printing the stack. | 993 // Allow only one stack trace to prevent recursively printing stack traces |
| 994 static uintptr_t started_dump = 0; | 994 // if we hit an assert while printing the stack. |
| 995 if (AtomicOperations::FetchAndIncrement(&started_dump) != 0) { | 995 static uintptr_t started_dump = 0; |
| 996 OS::PrintErr("Aborting re-entrant request for stack trace.\n"); | 996 if (AtomicOperations::FetchAndIncrement(&started_dump) != 0) { |
| 997 return; | 997 OS::PrintErr("Aborting re-entrant request for stack trace.\n"); |
| 998 return; | |
| 999 } | |
| 998 } | 1000 } |
|
siva
2017/04/13 01:50:18
Why is this logic relevant only when for_crash is
| |
| 999 | 1001 |
| 1000 Thread* thread = Thread::Current(); | 1002 Thread* thread = Thread::Current(); |
| 1001 if (thread == NULL) { | 1003 if (thread == NULL) { |
| 1002 return; | 1004 return; |
| 1003 } | 1005 } |
| 1004 OSThread* os_thread = thread->os_thread(); | 1006 OSThread* os_thread = thread->os_thread(); |
| 1005 ASSERT(os_thread != NULL); | 1007 ASSERT(os_thread != NULL); |
| 1006 Isolate* isolate = thread->isolate(); | 1008 Isolate* isolate = thread->isolate(); |
| 1007 if (!CheckIsolate(isolate)) { | 1009 if (!CheckIsolate(isolate)) { |
| 1008 return; | 1010 return; |
| (...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1602 | 1604 |
| 1603 | 1605 |
| 1604 ProcessedSampleBuffer::ProcessedSampleBuffer() | 1606 ProcessedSampleBuffer::ProcessedSampleBuffer() |
| 1605 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { | 1607 : code_lookup_table_(new CodeLookupTable(Thread::Current())) { |
| 1606 ASSERT(code_lookup_table_ != NULL); | 1608 ASSERT(code_lookup_table_ != NULL); |
| 1607 } | 1609 } |
| 1608 | 1610 |
| 1609 #endif // !PRODUCT | 1611 #endif // !PRODUCT |
| 1610 | 1612 |
| 1611 } // namespace dart | 1613 } // namespace dart |
| OLD | NEW |