| 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 702 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 713   return Debugger::IsDebuggable(function()); | 713   return Debugger::IsDebuggable(function()); | 
| 714 } | 714 } | 
| 715 | 715 | 
| 716 | 716 | 
| 717 void ActivationFrame::PrintDescriptorsError(const char* message) { | 717 void ActivationFrame::PrintDescriptorsError(const char* message) { | 
| 718   OS::PrintErr("Bad descriptors: %s\n", message); | 718   OS::PrintErr("Bad descriptors: %s\n", message); | 
| 719   OS::PrintErr("function %s\n", function().ToQualifiedCString()); | 719   OS::PrintErr("function %s\n", function().ToQualifiedCString()); | 
| 720   OS::PrintErr("pc_ %" Px "\n", pc_); | 720   OS::PrintErr("pc_ %" Px "\n", pc_); | 
| 721   OS::PrintErr("deopt_id_ %" Px "\n", deopt_id_); | 721   OS::PrintErr("deopt_id_ %" Px "\n", deopt_id_); | 
| 722   OS::PrintErr("context_level_ %" Px "\n", context_level_); | 722   OS::PrintErr("context_level_ %" Px "\n", context_level_); | 
|  | 723 #if !defined(DART_PRECOMPILED_RUNTIME) | 
| 723   DisassembleToStdout formatter; | 724   DisassembleToStdout formatter; | 
| 724   code().Disassemble(&formatter); | 725   code().Disassemble(&formatter); | 
|  | 726 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
| 725   PcDescriptors::Handle(code().pc_descriptors()).Print(); | 727   PcDescriptors::Handle(code().pc_descriptors()).Print(); | 
| 726   StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, | 728   StackFrameIterator frames(StackFrameIterator::kDontValidateFrames, | 
| 727                             Thread::Current(), | 729                             Thread::Current(), | 
| 728                             StackFrameIterator::kNoCrossThreadIteration); | 730                             StackFrameIterator::kNoCrossThreadIteration); | 
| 729   StackFrame* frame = frames.NextFrame(); | 731   StackFrame* frame = frames.NextFrame(); | 
| 730   while (frame != NULL) { | 732   while (frame != NULL) { | 
| 731     OS::PrintErr("%s\n", frame->ToCString()); | 733     OS::PrintErr("%s\n", frame->ToCString()); | 
| 732     frame = frames.NextFrame(); | 734     frame = frames.NextFrame(); | 
| 733   } | 735   } | 
| 734   OS::Abort(); | 736   OS::Abort(); | 
| (...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1883     const Context& ctx = activation->GetSavedCurrentContext(); | 1885     const Context& ctx = activation->GetSavedCurrentContext(); | 
| 1884     OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString()); | 1886     OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString()); | 
| 1885   } | 1887   } | 
| 1886   if (FLAG_trace_debugger_stacktrace) { | 1888   if (FLAG_trace_debugger_stacktrace) { | 
| 1887     OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber()); | 1889     OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber()); | 
| 1888   } | 1890   } | 
| 1889   return activation; | 1891   return activation; | 
| 1890 } | 1892 } | 
| 1891 | 1893 | 
| 1892 | 1894 | 
|  | 1895 #if !defined(DART_PRECOMPILED_RUNTIME) | 
| 1893 RawArray* Debugger::DeoptimizeToArray(Thread* thread, | 1896 RawArray* Debugger::DeoptimizeToArray(Thread* thread, | 
| 1894                                       StackFrame* frame, | 1897                                       StackFrame* frame, | 
| 1895                                       const Code& code) { | 1898                                       const Code& code) { | 
| 1896   ASSERT(code.is_optimized()); | 1899   ASSERT(code.is_optimized()); | 
| 1897   Isolate* isolate = thread->isolate(); | 1900   Isolate* isolate = thread->isolate(); | 
| 1898   // Create the DeoptContext for this deoptimization. | 1901   // Create the DeoptContext for this deoptimization. | 
| 1899   DeoptContext* deopt_context = | 1902   DeoptContext* deopt_context = | 
| 1900       new DeoptContext(frame, code, DeoptContext::kDestIsAllocated, NULL, NULL, | 1903       new DeoptContext(frame, code, DeoptContext::kDestIsAllocated, NULL, NULL, | 
| 1901                        true, false /* deoptimizing_code */); | 1904                        true, false /* deoptimizing_code */); | 
| 1902   isolate->set_deopt_context(deopt_context); | 1905   isolate->set_deopt_context(deopt_context); | 
| 1903 | 1906 | 
| 1904   deopt_context->FillDestFrame(); | 1907   deopt_context->FillDestFrame(); | 
| 1905   deopt_context->MaterializeDeferredObjects(); | 1908   deopt_context->MaterializeDeferredObjects(); | 
| 1906   const Array& dest_frame = | 1909   const Array& dest_frame = | 
| 1907       Array::Handle(thread->zone(), deopt_context->DestFrameAsArray()); | 1910       Array::Handle(thread->zone(), deopt_context->DestFrameAsArray()); | 
| 1908 | 1911 | 
| 1909   isolate->set_deopt_context(NULL); | 1912   isolate->set_deopt_context(NULL); | 
| 1910   delete deopt_context; | 1913   delete deopt_context; | 
| 1911 | 1914 | 
| 1912   return dest_frame.raw(); | 1915   return dest_frame.raw(); | 
| 1913 } | 1916 } | 
|  | 1917 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
| 1914 | 1918 | 
| 1915 | 1919 | 
| 1916 DebuggerStackTrace* Debugger::CollectStackTrace() { | 1920 DebuggerStackTrace* Debugger::CollectStackTrace() { | 
| 1917   Thread* thread = Thread::Current(); | 1921   Thread* thread = Thread::Current(); | 
| 1918   Zone* zone = thread->zone(); | 1922   Zone* zone = thread->zone(); | 
| 1919   Isolate* isolate = thread->isolate(); | 1923   Isolate* isolate = thread->isolate(); | 
| 1920   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 1924   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 
| 1921   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 1925   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 
| 1922                               Thread::Current(), | 1926                               Thread::Current(), | 
| 1923                               StackFrameIterator::kNoCrossThreadIteration); | 1927                               StackFrameIterator::kNoCrossThreadIteration); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 1942 } | 1946 } | 
| 1943 | 1947 | 
| 1944 void Debugger::AppendCodeFrames(Thread* thread, | 1948 void Debugger::AppendCodeFrames(Thread* thread, | 
| 1945                                 Isolate* isolate, | 1949                                 Isolate* isolate, | 
| 1946                                 Zone* zone, | 1950                                 Zone* zone, | 
| 1947                                 DebuggerStackTrace* stack_trace, | 1951                                 DebuggerStackTrace* stack_trace, | 
| 1948                                 StackFrame* frame, | 1952                                 StackFrame* frame, | 
| 1949                                 Code* code, | 1953                                 Code* code, | 
| 1950                                 Code* inlined_code, | 1954                                 Code* inlined_code, | 
| 1951                                 Array* deopt_frame) { | 1955                                 Array* deopt_frame) { | 
| 1952   if (code->is_optimized() && !FLAG_precompiled_runtime) { | 1956 #if !defined(DART_PRECOMPILED_RUNTIME) | 
|  | 1957   if (code->is_optimized()) { | 
| 1953     // TODO(rmacnak): Use CodeSourceMap | 1958     // TODO(rmacnak): Use CodeSourceMap | 
| 1954     *deopt_frame = DeoptimizeToArray(thread, frame, *code); | 1959     *deopt_frame = DeoptimizeToArray(thread, frame, *code); | 
| 1955     for (InlinedFunctionsIterator it(*code, frame->pc()); !it.Done(); | 1960     for (InlinedFunctionsIterator it(*code, frame->pc()); !it.Done(); | 
| 1956          it.Advance()) { | 1961          it.Advance()) { | 
| 1957       *inlined_code = it.code(); | 1962       *inlined_code = it.code(); | 
| 1958       if (FLAG_trace_debugger_stacktrace) { | 1963       if (FLAG_trace_debugger_stacktrace) { | 
| 1959         const Function& function = Function::Handle(zone, it.function()); | 1964         const Function& function = Function::Handle(zone, it.function()); | 
| 1960         ASSERT(!function.IsNull()); | 1965         ASSERT(!function.IsNull()); | 
| 1961         OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n", | 1966         OS::PrintErr("CollectStackTrace: visiting inlined function: %s\n", | 
| 1962                      function.ToFullyQualifiedCString()); | 1967                      function.ToFullyQualifiedCString()); | 
| 1963       } | 1968       } | 
| 1964       intptr_t deopt_frame_offset = it.GetDeoptFpOffset(); | 1969       intptr_t deopt_frame_offset = it.GetDeoptFpOffset(); | 
| 1965       stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame, | 1970       stack_trace->AddActivation(CollectDartFrame(isolate, it.pc(), frame, | 
| 1966                                                   *inlined_code, *deopt_frame, | 1971                                                   *inlined_code, *deopt_frame, | 
| 1967                                                   deopt_frame_offset)); | 1972                                                   deopt_frame_offset)); | 
| 1968     } | 1973     } | 
| 1969   } else { | 1974     return; | 
| 1970     stack_trace->AddActivation(CollectDartFrame( |  | 
| 1971         isolate, frame->pc(), frame, *code, Object::null_array(), 0)); |  | 
| 1972   } | 1975   } | 
|  | 1976 #endif  // !defined(DART_PRECOMPILED_RUNTIME) | 
|  | 1977   stack_trace->AddActivation(CollectDartFrame(isolate, frame->pc(), frame, | 
|  | 1978                                               *code, Object::null_array(), 0)); | 
| 1973 } | 1979 } | 
| 1974 | 1980 | 
| 1975 | 1981 | 
| 1976 DebuggerStackTrace* Debugger::CollectAsyncCausalStackTrace() { | 1982 DebuggerStackTrace* Debugger::CollectAsyncCausalStackTrace() { | 
| 1977   if (!FLAG_causal_async_stacks) { | 1983   if (!FLAG_causal_async_stacks) { | 
| 1978     return NULL; | 1984     return NULL; | 
| 1979   } | 1985   } | 
| 1980   Thread* thread = Thread::Current(); | 1986   Thread* thread = Thread::Current(); | 
| 1981   Zone* zone = thread->zone(); | 1987   Zone* zone = thread->zone(); | 
| 1982   Isolate* isolate = thread->isolate(); | 1988   Isolate* isolate = thread->isolate(); | 
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2053     } | 2059     } | 
| 2054     // Follow the link. | 2060     // Follow the link. | 
| 2055     async_stack_trace = async_stack_trace.async_link(); | 2061     async_stack_trace = async_stack_trace.async_link(); | 
| 2056   } | 2062   } | 
| 2057 | 2063 | 
| 2058   return stack_trace; | 2064   return stack_trace; | 
| 2059 } | 2065 } | 
| 2060 | 2066 | 
| 2061 | 2067 | 
| 2062 DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() { | 2068 DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() { | 
|  | 2069 #if defined(DART_PRECOMPILED_RUNTIME) | 
|  | 2070   // Causal async stacks are not supported in the AOT runtime. | 
|  | 2071   ASSERT(!FLAG_async_debugger); | 
|  | 2072   return NULL; | 
|  | 2073 #else | 
| 2063   if (!FLAG_async_debugger) { | 2074   if (!FLAG_async_debugger) { | 
| 2064     return NULL; | 2075     return NULL; | 
| 2065   } | 2076   } | 
| 2066   // Causal async stacks are not supported in the AOT runtime. |  | 
| 2067   ASSERT(!FLAG_precompiled_runtime); |  | 
| 2068 | 2077 | 
| 2069   Thread* thread = Thread::Current(); | 2078   Thread* thread = Thread::Current(); | 
| 2070   Zone* zone = thread->zone(); | 2079   Zone* zone = thread->zone(); | 
| 2071   Isolate* isolate = thread->isolate(); | 2080   Isolate* isolate = thread->isolate(); | 
| 2072   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 2081   DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8); | 
| 2073 | 2082 | 
| 2074   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 2083   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 
| 2075                               Thread::Current(), | 2084                               Thread::Current(), | 
| 2076                               StackFrameIterator::kNoCrossThreadIteration); | 2085                               StackFrameIterator::kNoCrossThreadIteration); | 
| 2077 | 2086 | 
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2196         } else { | 2205         } else { | 
| 2197           stack_trace->AddAsyncCausalFrame(pc, code); | 2206           stack_trace->AddAsyncCausalFrame(pc, code); | 
| 2198         } | 2207         } | 
| 2199       } | 2208       } | 
| 2200     } | 2209     } | 
| 2201     // Follow the link. | 2210     // Follow the link. | 
| 2202     async_stack_trace = async_stack_trace.async_link(); | 2211     async_stack_trace = async_stack_trace.async_link(); | 
| 2203   } | 2212   } | 
| 2204 | 2213 | 
| 2205   return stack_trace; | 2214   return stack_trace; | 
|  | 2215 #endif  // defined(DART_PRECOMPILED_RUNTIME) | 
| 2206 } | 2216 } | 
| 2207 | 2217 | 
| 2208 | 2218 | 
| 2209 ActivationFrame* Debugger::TopDartFrame() const { | 2219 ActivationFrame* Debugger::TopDartFrame() const { | 
| 2210   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 2220   StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames, | 
| 2211                               Thread::Current(), | 2221                               Thread::Current(), | 
| 2212                               StackFrameIterator::kNoCrossThreadIteration); | 2222                               StackFrameIterator::kNoCrossThreadIteration); | 
| 2213   StackFrame* frame = iterator.NextFrame(); | 2223   StackFrame* frame = iterator.NextFrame(); | 
| 2214   while ((frame != NULL) && !frame->IsDartFrame()) { | 2224   while ((frame != NULL) && !frame->IsDartFrame()) { | 
| 2215     frame = iterator.NextFrame(); | 2225     frame = iterator.NextFrame(); | 
| (...skipping 2322 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4538 | 4548 | 
| 4539 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 4549 void Debugger::RegisterCodeBreakpoint(CodeBreakpoint* bpt) { | 
| 4540   ASSERT(bpt->next() == NULL); | 4550   ASSERT(bpt->next() == NULL); | 
| 4541   bpt->set_next(code_breakpoints_); | 4551   bpt->set_next(code_breakpoints_); | 
| 4542   code_breakpoints_ = bpt; | 4552   code_breakpoints_ = bpt; | 
| 4543 } | 4553 } | 
| 4544 | 4554 | 
| 4545 #endif  // !PRODUCT | 4555 #endif  // !PRODUCT | 
| 4546 | 4556 | 
| 4547 }  // namespace dart | 4557 }  // namespace dart | 
| OLD | NEW | 
|---|