⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 debug.h.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
// Copyright 2006-2008 the V8 project authors. All rights reserved.// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met:////     * Redistributions of source code must retain the above copyright//       notice, this list of conditions and the following disclaimer.//     * Redistributions in binary form must reproduce the above//       copyright notice, this list of conditions and the following//       disclaimer in the documentation and/or other materials provided//       with the distribution.//     * Neither the name of Google Inc. nor the names of its//       contributors may be used to endorse or promote products derived//       from this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#ifndef V8_V8_DEBUG_H_#define V8_V8_DEBUG_H_#include "../include/v8-debug.h"#include "assembler.h"#include "code-stubs.h"#include "factory.h"#include "platform.h"#include "string-stream.h"namespace v8 { namespace internal {// Step actions. NOTE: These values are in macros.py as well.enum StepAction {  StepNone = -1,  // Stepping not prepared.  StepOut = 0,   // Step out of the current function.  StepNext = 1,  // Step to the next statement in the current function.  StepIn = 2,    // Step into new functions invoked or the next statement                 // in the current function.  StepMin = 3,   // Perform a minimum step in the current function.  StepInMin = 4  // Step into new functions invoked or perform a minimum step                 // in the current function.};// Type of exception break. NOTE: These values are in macros.py as well.enum ExceptionBreakType {  BreakException = 0,  BreakUncaughtException = 1};// Type of exception break. NOTE: These values are in macros.py as well.enum BreakLocatorType {  ALL_BREAK_LOCATIONS = 0,  SOURCE_BREAK_LOCATIONS = 1};// Class for iterating through the break points in a function and changing// them.class BreakLocationIterator { public:  explicit BreakLocationIterator(Handle<DebugInfo> debug_info,                                 BreakLocatorType type);  virtual ~BreakLocationIterator();  void Next();  void Next(int count);  void FindBreakLocationFromAddress(Address pc);  void FindBreakLocationFromPosition(int position);  void Reset();  bool Done() const;  void SetBreakPoint(Handle<Object> break_point_object);  void ClearBreakPoint(Handle<Object> break_point_object);  void SetOneShot();  void ClearOneShot();  void PrepareStepIn();  bool IsExit() const;  bool HasBreakPoint();  bool IsDebugBreak();  Object* BreakPointObjects();  inline int code_position() { return pc() - debug_info_->code()->entry(); }  inline int break_point() { return break_point_; }  inline int position() { return position_; }  inline int statement_position() { return statement_position_; }  inline Address pc() { return reloc_iterator_->rinfo()->pc(); }  inline Code* code() { return debug_info_->code(); }  inline RelocInfo* rinfo() { return reloc_iterator_->rinfo(); }  inline RelocInfo::Mode rmode() const {    return reloc_iterator_->rinfo()->rmode();  }  inline RelocInfo* original_rinfo() {    return reloc_iterator_original_->rinfo();  }  inline RelocInfo::Mode original_rmode() const {    return reloc_iterator_original_->rinfo()->rmode();  } protected:  bool RinfoDone() const;  void RinfoNext();  BreakLocatorType type_;  int break_point_;  int position_;  int statement_position_;  Handle<DebugInfo> debug_info_;  RelocIterator* reloc_iterator_;  RelocIterator* reloc_iterator_original_; private:  void SetDebugBreak();  void ClearDebugBreak();  DISALLOW_COPY_AND_ASSIGN(BreakLocationIterator);};// Linked list holding debug info objects. The debug info objects are kept as// weak handles to avoid a debug info object to keep a function alive.class DebugInfoListNode { public:  explicit DebugInfoListNode(DebugInfo* debug_info);  virtual ~DebugInfoListNode();  DebugInfoListNode* next() { return next_; }  void set_next(DebugInfoListNode* next) { next_ = next; }  Handle<DebugInfo> debug_info() { return debug_info_; } private:  // Global (weak) handle to the debug info object.  Handle<DebugInfo> debug_info_;  // Next pointer for linked list.  DebugInfoListNode* next_;};// This class contains the debugger support. The main purpose is to handle// setting break points in the code.//// This class controls the debug info for all functions which currently have// active breakpoints in them. This debug info is held in the heap root object// debug_info which is a FixedArray. Each entry in this list is of class// DebugInfo.class Debug { public:  static void Setup(bool create_heap_objects);  static bool Load();  static void Unload();  static bool IsLoaded() { return !debug_context_.is_null(); }  static bool InDebugger() { return Top::is_break(); }  static void Iterate(ObjectVisitor* v);  static Object* Break(Arguments args);  static void SetBreakPoint(Handle<SharedFunctionInfo> shared,                            int source_position,                            Handle<Object> break_point_object);  static void ClearBreakPoint(Handle<Object> break_point_object);  static void FloodWithOneShot(Handle<SharedFunctionInfo> shared);  static void FloodHandlerWithOneShot();  static void ChangeBreakOnException(ExceptionBreakType type, bool enable);  static void PrepareStep(StepAction step_action, int step_count);  static void ClearStepping();  static bool StepNextContinue(BreakLocationIterator* break_location_iterator,                               JavaScriptFrame* frame);  static Handle<DebugInfo> GetDebugInfo(Handle<SharedFunctionInfo> shared);  static bool HasDebugInfo(Handle<SharedFunctionInfo> shared);  // Returns whether the operation succedded.  static bool EnsureDebugInfo(Handle<SharedFunctionInfo> shared);  static bool IsDebugBreak(Address addr);  // Check whether a code stub with the specified major key is a possible break  // point location.  static bool IsSourceBreakStub(Code* code);  static bool IsBreakStub(Code* code);  // Find the builtin to use for invoking the debug break  static Handle<Code> FindDebugBreak(RelocInfo* rinfo);  static Handle<Object> GetSourceBreakLocations(      Handle<SharedFunctionInfo> shared);  static Code* GetCodeTarget(Address target);  // Getter for the debug_context.  inline static Handle<Context> debug_context() { return debug_context_; }  // Check whether a global object is the debug global object.  static bool IsDebugGlobal(GlobalObject* global);  // Fast check to see if any break points are active.  inline static bool has_break_points() { return has_break_points_; }  static bool StepInActive() { return thread_local_.step_into_fp_ != 0; }  static Address step_in_fp() { return thread_local_.step_into_fp_; }  static Address* step_in_fp_addr() { return &thread_local_.step_into_fp_; }  // Getter and setter for the disable break state.  static bool disable_break() { return disable_break_; }  static void set_disable_break(bool disable_break) {    disable_break_ = disable_break;  }  // Getters for the current exception break state.  static bool break_on_exception() { return break_on_exception_; }  static bool break_on_uncaught_exception() {    return break_on_uncaught_exception_;  }  enum AddressId {    k_after_break_target_address,    k_debug_break_return_address,    k_register_address  };  // Support for setting the address to jump to when returning from break point.  static Address* after_break_target_address() {    return reinterpret_cast<Address*>(&thread_local_.after_break_target_);  }  // Support for saving/restoring registers when handling debug break calls.  static Address* register_address(int r) {    return reinterpret_cast<Address *>(&registers_[r]);  }  // Address of the debug break return entry code.  static Code* debug_break_return_entry() { return debug_break_return_entry_; }  // Support for getting the address of the debug break on return code.  static Address* debug_break_return_address() {    return reinterpret_cast<Address*>(&debug_break_return_);  }  static const int kEstimatedNofDebugInfoEntries = 16;  static const int kEstimatedNofBreakPointsInFunction = 16;  static void HandleWeakDebugInfo(v8::Persistent<v8::Object> obj, void* data);  friend class Debugger;  friend Handle<FixedArray> GetDebuggedFunctions();  // Found in test-debug.cc  // Threading support.  static char* ArchiveDebug(char* to);  static char* RestoreDebug(char* from);  static int ArchiveSpacePerThread();  // Code generation assumptions.  static const int kIa32CallInstructionLength = 5;  static const int kIa32JSReturnSequenceLength = 6; private:  static bool CompileDebuggerScript(int index);  static void ClearOneShot();  static void ActivateStepIn(StackFrame* frame);  static void ClearStepIn();  static void ClearStepNext();  // Returns whether the compile succedded.  static bool EnsureCompiled(Handle<SharedFunctionInfo> shared);  static void RemoveDebugInfo(Handle<DebugInfo> debug_info);  static void SetAfterBreakTarget(JavaScriptFrame* frame);  static Handle<Object> CheckBreakPoints(Handle<Object> break_point);  static bool CheckBreakPoint(Handle<Object> break_point_object);  // Global handle to debug context where all the debugger JavaScript code is  // loaded.  static Handle<Context> debug_context_;  // Boolean state indicating whether any break points are set.  static bool has_break_points_;  static DebugInfoListNode* debug_info_list_;  static bool disable_break_;  static bool break_on_exception_;  static bool break_on_uncaught_exception_;  // Per-thread:  class ThreadLocal {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -