| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "vm/debugger.h" | 5 #include "vm/debugger.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 | 8 |
| 9 #include "platform/address_sanitizer.h" | 9 #include "platform/address_sanitizer.h" |
| 10 | 10 |
| (...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 bool ActivationFrame::IsDebuggable() const { | 665 bool ActivationFrame::IsDebuggable() const { |
| 666 return Debugger::IsDebuggable(function()); | 666 return Debugger::IsDebuggable(function()); |
| 667 } | 667 } |
| 668 | 668 |
| 669 void ActivationFrame::PrintDescriptorsError(const char* message) { | 669 void ActivationFrame::PrintDescriptorsError(const char* message) { |
| 670 OS::PrintErr("Bad descriptors: %s\n", message); | 670 OS::PrintErr("Bad descriptors: %s\n", message); |
| 671 OS::PrintErr("function %s\n", function().ToQualifiedCString()); | 671 OS::PrintErr("function %s\n", function().ToQualifiedCString()); |
| 672 OS::PrintErr("pc_ %" Px "\n", pc_); | 672 OS::PrintErr("pc_ %" Px "\n", pc_); |
| 673 OS::PrintErr("deopt_id_ %" Px "\n", deopt_id_); | 673 OS::PrintErr("deopt_id_ %" Px "\n", deopt_id_); |
| 674 OS::PrintErr("context_level_ %" Px "\n", context_level_); | 674 OS::PrintErr("context_level_ %" Px "\n", context_level_); |
| 675 #if !defined(DART_PRECOMPILED_RUNTIME) |
| 675 DisassembleToStdout formatter; | 676 DisassembleToStdout formatter; |
| 676 code().Disassemble(&formatter); | 677 code().Disassemble(&formatter); |
| 678 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| 677 PcDescriptors::Handle(code().pc_descriptors()).Print(); | 679 PcDescriptors::Handle(code().pc_descriptors()).Print(); |
| 678 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, | 680 StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, |
| 679 Thread::Current(), | 681 Thread::Current(), |
| 680 StackFrameIterator::kNoCrossThreadIteration); | 682 StackFrameIterator::kNoCrossThreadIteration); |
| 681 StackFrame* frame = frames.NextFrame(); | 683 StackFrame* frame = frames.NextFrame(); |
| 682 while (frame != NULL) { | 684 while (frame != NULL) { |
| 683 OS::PrintErr("%s\n", frame->ToCString()); | 685 OS::PrintErr("%s\n", frame->ToCString()); |
| 684 frame = frames.NextFrame(); | 686 frame = frames.NextFrame(); |
| 685 } | 687 } |
| 686 OS::Abort(); | 688 OS::Abort(); |
| (...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1773 if (FLAG_trace_debugger_stacktrace) { | 1775 if (FLAG_trace_debugger_stacktrace) { |
| 1774 const Context& ctx = activation->GetSavedCurrentContext(); | 1776 const Context& ctx = activation->GetSavedCurrentContext(); |
| 1775 OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString()); | 1777 OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString()); |
| 1776 } | 1778 } |
| 1777 if (FLAG_trace_debugger_stacktrace) { | 1779 if (FLAG_trace_debugger_stacktrace) { |
| 1778 OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber()); | 1780 OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber()); |
| 1779 } | 1781 } |
| 1780 return activation; | 1782 return activation; |
| 1781 } | 1783 } |
| 1782 | 1784 |
| 1785 #if !defined(DART_PRECOMPILED_RUNTIME) |
| 1783 RawArray* Debugger::DeoptimizeToArray(Thread* thread, | 1786 RawArray* Debugger::DeoptimizeToArray(Thread* thread, |
| 1784 StackFrame* frame, | 1787 StackFrame* frame, |
| 1785 const Code& code) { | 1788 const Code& code) { |
| 1786 ASSERT(code.is_optimized()); | 1789 ASSERT(code.is_optimized()); |
| 1787 Isolate* isolate = thread->isolate(); | 1790 Isolate* isolate = thread->isolate(); |
| 1788 // Create the DeoptContext for this deoptimization. | 1791 // Create the DeoptContext for this deoptimization. |
| 1789 DeoptContext* deopt_context = | 1792 DeoptContext* deopt_context = |
| 1790 new DeoptContext(frame, code, DeoptContext::kDestIsAllocated, NULL, NULL, | 1793 new DeoptContext(frame, code, DeoptContext::kDestIsAllocated, NULL, NULL, |
| 1791 true, false /* deoptimizing_code */); | 1794 true, false /* deoptimizing_code */); |
| 1792 isolate->set_deopt_context(deopt_context); | 1795 isolate->set_deopt_context(deopt_context); |
| 1793 | 1796 |
| 1794 deopt_context->FillDestFrame(); | 1797 deopt_context->FillDestFrame(); |
| 1795 deopt_context->MaterializeDeferredObjects(); | 1798 deopt_context->MaterializeDeferredObjects(); |
| 1796 const Array& dest_frame = | 1799 const Array& dest_frame = |
| 1797 Array::Handle(thread->zone(), deopt_context->DestFrameAsArray()); | 1800 Array::Handle(thread->zone(), deopt_context->DestFrameAsArray()); |
| 1798 | 1801 |
| 1799 isolate->set_deopt_context(NULL); | 1802 isolate->set_deopt_context(NULL); |
| 1800 delete deopt_context; | 1803 delete deopt_context; |
| 1801 | 1804 |
| 1802 return dest_frame.raw(); | 1805 return dest_frame.raw(); |
| 1803 } | 1806 } |
| 1807 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| 1804 | 1808 |
| 1805 DebuggerStackTrace* Debugger::CollectStackTrace() { | 1809 DebuggerStackTrace* Debugger::CollectStackTrace() { |
| 1806 Thread* thread = Thread::Current(); | 1810 Thread* thread = Thread::Current(); |
| 1807 Zone* zone = thread->zone(); | 1811 Zone* zone = thread->zone(); |
| 1808 Isolate* isolate = thread->isolate(); | 1812 Isolate* isolate = thread->isolate(); |
| 1809 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 1813 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); |
| 1810 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 1814 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, |
| 1811 Thread::Current(), | 1815 Thread::Current(), |
| 1812 StackFrameIterator::kNoCrossThreadIteration); | 1816 StackFrameIterator::kNoCrossThreadIteration); |
| 1813 Code& code = Code::Handle(zone); | 1817 Code& code = Code::Handle(zone); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1831 } | 1835 } |
| 1832 | 1836 |
| 1833 void Debugger::AppendCodeFrames(Thread* thread, | 1837 void Debugger::AppendCodeFrames(Thread* thread, |
| 1834 Isolate* isolate, | 1838 Isolate* isolate, |
| 1835 Zone* zone, | 1839 Zone* zone, |
| 1836 DebuggerStackTrace* stack_trace, | 1840 DebuggerStackTrace* stack_trace, |
| 1837 StackFrame* frame, | 1841 StackFrame* frame, |
| 1838 Code* code, | 1842 Code* code, |
| 1839 Code* inlined_code, | 1843 Code* inlined_code, |
| 1840 Array* deopt_frame) { | 1844 Array* deopt_frame) { |
| 1841 if (code->is_optimized() && !FLAG_precompiled_runtime) { | 1845 #if !defined(DART_PRECOMPILED_RUNTIME) |
| 1846 if (code->is_optimized()) { |
| 1842 // TODO(rmacnak): Use CodeSourceMap | 1847 // TODO(rmacnak): Use CodeSourceMap |
| 1843 *deopt_frame = DeoptimizeToArray(thread, frame, *code); | 1848 *deopt_frame = DeoptimizeToArray(thread, frame, *code); |
| 1844 for (InlinedFunctionsIterator it(*code, frame->pc()); !it.Done(); | 1849 for (InlinedFunctionsIterator it(*code, frame->pc()); !it.Done(); |
| 1845 it.Advance()) { | 1850 it.Advance()) { |
| 1846 *inlined_code = it.code(); | 1851 *inlined_code = it.code(); |
| 1847 if (FLAG_trace_debugger_stacktrace) { | 1852 if (FLAG_trace_debugger_stacktrace) { |
| 1848 const Function& function = Function::Handle(zone, it.function()); | 1853 const Function& function = Function::Handle(zone, it.function()); |
| 1849 ASSERT(!function.IsNull()); | 1854 ASSERT(!function.IsNull()); |
| 1850 OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n", | 1855 OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n", |
| 1851 function.ToFullyQualifiedCString()); | 1856 function.ToFullyQualifiedCString()); |
| 1852 } | 1857 } |
| 1853 intptr_t deopt_frame_offset = it.GetDeoptFpOffset(); | 1858 intptr_t deopt_frame_offset = it.GetDeoptFpOffset(); |
| 1854 stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame, | 1859 stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame, |
| 1855 *inlined_code, *deopt_frame, | 1860 *inlined_code, *deopt_frame, |
| 1856 deopt_frame_offset)); | 1861 deopt_frame_offset)); |
| 1857 } | 1862 } |
| 1858 } else { | 1863 return; |
| 1859 stack_trace->AddActivation(CollectDartFrame( | |
| 1860 isolate, frame->pc(), frame, *code, Object::null_array(), 0)); | |
| 1861 } | 1864 } |
| 1865 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| 1866 stack_trace->AddActivation(CollectDartFrame(isolate, frame->pc(), frame, |
| 1867 *code, Object::null_array(), 0)); |
| 1862 } | 1868 } |
| 1863 | 1869 |
| 1864 DebuggerStackTrace* Debugger::CollectAsyncCausalStackTrace() { | 1870 DebuggerStackTrace* Debugger::CollectAsyncCausalStackTrace() { |
| 1865 if (!FLAG_causal_async_stacks) { | 1871 if (!FLAG_causal_async_stacks) { |
| 1866 return NULL; | 1872 return NULL; |
| 1867 } | 1873 } |
| 1868 Thread* thread = Thread::Current(); | 1874 Thread* thread = Thread::Current(); |
| 1869 Zone* zone = thread->zone(); | 1875 Zone* zone = thread->zone(); |
| 1870 Isolate* isolate = thread->isolate(); | 1876 Isolate* isolate = thread->isolate(); |
| 1871 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 1877 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1940 } | 1946 } |
| 1941 } | 1947 } |
| 1942 // Follow the link. | 1948 // Follow the link. |
| 1943 async_stack_trace = async_stack_trace.async_link(); | 1949 async_stack_trace = async_stack_trace.async_link(); |
| 1944 } | 1950 } |
| 1945 | 1951 |
| 1946 return stack_trace; | 1952 return stack_trace; |
| 1947 } | 1953 } |
| 1948 | 1954 |
| 1949 DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() { | 1955 DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() { |
| 1956 #if defined(DART_PRECOMPILED_RUNTIME) |
| 1957 // Causal async stacks are not supported in the AOT runtime. |
| 1958 ASSERT(!FLAG_async_debugger); |
| 1959 return NULL; |
| 1960 #else |
| 1950 if (!FLAG_async_debugger) { | 1961 if (!FLAG_async_debugger) { |
| 1951 return NULL; | 1962 return NULL; |
| 1952 } | 1963 } |
| 1953 // Causal async stacks are not supported in the AOT runtime. | |
| 1954 ASSERT(!FLAG_precompiled_runtime); | |
| 1955 | 1964 |
| 1956 Thread* thread = Thread::Current(); | 1965 Thread* thread = Thread::Current(); |
| 1957 Zone* zone = thread->zone(); | 1966 Zone* zone = thread->zone(); |
| 1958 Isolate* isolate = thread->isolate(); | 1967 Isolate* isolate = thread->isolate(); |
| 1959 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 1968 DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); |
| 1960 | 1969 |
| 1961 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 1970 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, |
| 1962 Thread::Current(), | 1971 Thread::Current(), |
| 1963 StackFrameIterator::kNoCrossThreadIteration); | 1972 StackFrameIterator::kNoCrossThreadIteration); |
| 1964 | 1973 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2083 } else { | 2092 } else { |
| 2084 stack_trace->AddAsyncCausalFrame(pc, code); | 2093 stack_trace->AddAsyncCausalFrame(pc, code); |
| 2085 } | 2094 } |
| 2086 } | 2095 } |
| 2087 } | 2096 } |
| 2088 // Follow the link. | 2097 // Follow the link. |
| 2089 async_stack_trace = async_stack_trace.async_link(); | 2098 async_stack_trace = async_stack_trace.async_link(); |
| 2090 } | 2099 } |
| 2091 | 2100 |
| 2092 return stack_trace; | 2101 return stack_trace; |
| 2102 #endif // defined(DART_PRECOMPILED_RUNTIME) |
| 2093 } | 2103 } |
| 2094 | 2104 |
| 2095 ActivationFrame* Debugger::TopDartFrame() const { | 2105 ActivationFrame* Debugger::TopDartFrame() const { |
| 2096 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 2106 StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, |
| 2097 Thread::Current(), | 2107 Thread::Current(), |
| 2098 StackFrameIterator::kNoCrossThreadIteration); | 2108 StackFrameIterator::kNoCrossThreadIteration); |
| 2099 StackFrame* frame = iterator.NextFrame(); | 2109 StackFrame* frame = iterator.NextFrame(); |
| 2100 while ((frame != NULL) && !frame->IsDartFrame()) { | 2110 while ((frame != NULL) && !frame->IsDartFrame()) { |
| 2101 frame = iterator.NextFrame(); | 2111 frame = iterator.NextFrame(); |
| 2102 } | 2112 } |
| (...skipping 2257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4360 | 4370 |
| 4361 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 4371 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { |
| 4362 ASSERT(bpt->next() == NULL); | 4372 ASSERT(bpt->next() == NULL); |
| 4363 bpt->set_next(code_breakpoints_); | 4373 bpt->set_next(code_breakpoints_); |
| 4364 code_breakpoints_ = bpt; | 4374 code_breakpoints_ = bpt; |
| 4365 } | 4375 } |
| 4366 | 4376 |
| 4367 #endif // !PRODUCT | 4377 #endif // !PRODUCT |
| 4368 | 4378 |
| 4369 } // namespace dart | 4379 } // namespace dart |
| OLD | NEW |