首页
社区
课程
招聘
[原创]V8 Inspector 看这一篇就够了
发表于: 2025-6-7 18:04 635

[原创]V8 Inspector 看这一篇就够了

2025-6-7 18:04
635

这篇文章将带大家从宏观把握 V8 Inspector, 将主要脉络串起来, 这样当你再去研究、魔改某个细微处时不至于没有方向。

实际上掌握了几个类的作用与从属关系, 我们的任务就搞定了。

将每个类完整的实现和注释贴出, 可以略看一眼:

V8InspectorImpl 类中的 std::unordered_map<int, std::map<int, V8InspectorSessionImpl*>> m_sessions 储存、管理 V8InspectorSessionImpl 类的实例。

V8InspectorSessionImpl 类中的 protocol::UberDispatcher m_dispatcher 是 UberDispatcher 类的实例, 来解析 CDP 协议处理的​​一级路由器​, 接收消息后, 通过 V8InspectorSessionImpl::dispatchProtocolMessage 函数调用 m_dispatcher.Dispatch 也就是 UberDispatcher 类的 Dispatch 方法, 实现代码如下:

然后在 m_dispatcher.Dispatch 方法内通过实例的 dispatchers_ 属性查找到二级命令分发器, 也就是 DomainDispatcher 类的实例, 实现代码:

查找到二级命令分发器 dispatcher 后, 在调用它的 Dispatch。而由 DomainDispatcher 的子类实现各自的逻辑, 可以搜索 class DomainDispatcherImpl : public protocol::DomainDispatcher

再跟进 weak->get()->sendResponse 方法:

再跟进 frontend_channel_->SendProtocolResponse

可以看到回到了 V8InspectorSessionImpl 类的 SendProtocolResponse 方法, 最终由 V8Inspector::Channel* m_channelsendResponse 发送, 脱离 V8 Inspector 体系, 到了 third_party/blink/renderer/core/inspector/devtools_session.cc 中, 我们也到此为止, 不在继续。

74eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7K9s2g2S2L8X3I4S2L8W2)9J5k6i4A6Z5K9h3S2#2i4K6u0W2j5$3!0E0i4K6u0r3M7q4)9J5c8U0b7J5y4o6j5J5x3K6p5^5x3b7`.`.

class V8InspectorImpl : public V8Inspector {
 public:
  V8_EXPORT_PRIVATE V8InspectorImpl(v8::Isolate*, V8InspectorClient*);
  ~V8InspectorImpl() override;
 
  // 禁止拷贝构造和赋值操作,避免对象被拷贝。
  V8InspectorImpl(const V8InspectorImpl&) = delete;
  V8InspectorImpl& operator=(const V8InspectorImpl&) = delete;
 
  // 获取当前的 V8 引擎隔离区。
  v8::Isolate* isolate() const { return m_isolate; }
 
  // 获取与该 Inspector 关联的客户端。
  V8InspectorClient* client() { return m_client; }
 
  // 获取调试器对象。
  V8Debugger* debugger() { return m_debugger.get(); }
 
  // 获取 Promise 处理器跟踪器。
  PromiseHandlerTracker& promiseHandlerTracker() {
    return m_promiseHandlerTracker;
  }
 
  // 根据上下文对象获取上下文组 ID。
  int contextGroupId(v8::Local<v8::Context>) const;
 
  // 根据上下文 ID 获取上下文组 ID。
  int contextGroupId(int contextId) const;
 
  // 根据唯一 ID 解析上下文 ID。
  int resolveUniqueContextId(internal::V8DebuggerId uniqueId) const;
 
  // 编译并运行内部脚本。
  v8::MaybeLocal<v8::Value> compileAndRunInternalScript(v8::Local<v8::Context>,
                                                        v8::Local<v8::String>);
 
  // 编译脚本。
  v8::MaybeLocal<v8::Script> compileScript(v8::Local<v8::Context>,
                                           const String16& code,
                                           const String16& fileName);
 
  // 获取正则表达式上下文。
  v8::MaybeLocal<v8::Context> regexContext();
 
  // 获取异常元数据上下文。
  v8::MaybeLocal<v8::Context> exceptionMetaDataContext();
 
  // 连接到调试会话,返回一个独立的会话对象。
  std::unique_ptr<V8InspectorSession> connect(int contextGroupId,
                                              V8Inspector::Channel*,
                                              StringView state,
                                              ClientTrustLevel,
                                              SessionPauseState) override;
 
  // 连接到调试会话,返回一个共享的会话对象。
  std::shared_ptr<V8InspectorSession> connectShared(int contextGroupId,
                                                    V8Inspector::Channel*,
                                                    StringView state,
                                                    ClientTrustLevel,
                                                    SessionPauseState) override;
 
  // 通知上下文创建。
  void contextCreated(const V8ContextInfo&) override;
 
  // 通知上下文销毁。
  void contextDestroyed(v8::Local<v8::Context>) override;
 
  // 根据上下文 ID 获取上下文对象。
  v8::MaybeLocal<v8::Context> contextById(int contextId) override;
 
  // 获取上下文的唯一调试器 ID。
  V8DebuggerId uniqueDebuggerId(int contextId) override;
 
  // 获取隔离区的唯一 ID。
  uint64_t isolateId() override;
 
  // 通知上下文被回收。
  void contextCollected(int contextGroupId, int contextId);
 
  // 重置上下文组。
  void resetContextGroup(int contextGroupId) override;
 
  // 通知空闲状态开始。
  void idleStarted() override;
 
  // 通知空闲状态结束。
  void idleFinished() override;
 
  // 通知异常被抛出。
  unsigned exceptionThrown(v8::Local<v8::Context>, StringView message,
                           v8::Local<v8::Value> exception,
                           StringView detailedMessage, StringView url,
                           unsigned lineNumber, unsigned columnNumber,
                           std::unique_ptr<V8StackTrace>,
                           int scriptId) override;
 
  // 通知异常被撤销。
  void exceptionRevoked(v8::Local<v8::Context>, unsigned exceptionId,
                        StringView message) override;
 
  // 创建堆栈跟踪。
  std::unique_ptr<V8StackTrace> createStackTrace(
      v8::Local<v8::StackTrace>) override;
 
  // 捕获当前堆栈跟踪。
  std::unique_ptr<V8StackTrace> captureStackTrace(bool fullStack) override;
 
  // 通知异步任务被调度。
  void asyncTaskScheduled(StringView taskName, void* task,
                          bool recurring) override;
 
  // 通知异步任务被取消。
  void asyncTaskCanceled(void* task) override;
 
  // 通知异步任务开始。
  void asyncTaskStarted(void* task) override;
 
  // 通知异步任务结束。
  void asyncTaskFinished(void* task) override;
 
  // 通知所有异步任务被取消。
  void allAsyncTasksCanceled() override;
 
  // 存储当前堆栈跟踪。
  V8StackTraceId storeCurrentStackTrace(StringView description) override;
 
  // 通知外部异步任务开始。
  void externalAsyncTaskStarted(const V8StackTraceId& parent) override;
 
  // 通知外部异步任务结束。
  void externalAsyncTaskFinished(const V8StackTraceId& parent) override;
 
  // 关联异常数据。
  V8_EXPORT_PRIVATE bool associateExceptionData(
      v8::Local<v8::Context>, v8::Local<v8::Value> exception,
      v8::Local<v8::Name> key, v8::Local<v8::Value> value) override;
 
  // 获取下一个异常 ID。
  unsigned nextExceptionId() { return ++m_lastExceptionId; }
 
  // 静音指定上下文组的异常。
  void muteExceptions(int contextGroupId);
 
  // 取消静音指定上下文组的异常。
  void unmuteExceptions(int contextGroupId);
 
  // 确保指定上下文组有控制台消息存储。
  V8ConsoleMessageStorage* ensureConsoleMessageStorage(int contextGroupId);
 
  // 检查指定上下文组是否有控制台消息存储。
  bool hasConsoleMessageStorage(int contextGroupId);
 
  // 丢弃被检查的上下文。
  void discardInspectedContext(int contextGroupId, int contextId);
 
  // 断开与调试会话的连接。
  void disconnect(V8InspectorSessionImpl*);
 
  // 根据上下文组 ID 和会话 ID 获取调试会话。
  V8InspectorSessionImpl* sessionById(int contextGroupId, int sessionId);
 
  // 根据上下文 ID 获取被检查的上下文。
  InspectedContext* getContext(int groupId, int contextId) const;
 
  // 根据上下文 ID 获取被检查的上下文。
  InspectedContext* getContext(int contextId) const;
 
  // 获取控制台对象。
  V8_EXPORT_PRIVATE V8Console* console();
 
  // 遍历指定上下文组的所有上下文。
  void forEachContext(int contextGroupId,
                      const std::function<void(InspectedContext*)>& callback);
 
  // 遍历指定上下文组的所有调试会话。
  void forEachSession(
      int contextGroupId,
      const std::function<void(V8InspectorSessionImpl*)>& callback);
 
  // 生成唯一 ID。
  int64_t generateUniqueId();
 
  // 获取与异常关联的数据。
  V8_EXPORT_PRIVATE v8::MaybeLocal<v8::Object> getAssociatedExceptionData(
      v8::Local<v8::Value> exception);
 
  // 获取与异常关联的数据(协议格式)。
  std::unique_ptr<protocol::DictionaryValue>
  getAssociatedExceptionDataForProtocol(v8::Local<v8::Value> exception);
 
  // EvaluateScope 类用于在特定作用域内执行脚本。
  class EvaluateScope {
   public:
    // 构造函数,初始化作用域。
    explicit EvaluateScope(const InjectedScript::Scope& scope);
 
    // 析构函数,清理资源。
    ~EvaluateScope();
 
    // 设置超时时间。
    protocol::Response setTimeout(double timeout);
 
   private:
    // 内部类和结构体,用于实现超时终止功能。
    class TerminateTask;
    struct CancelToken;
 
    // 作用域对象。
    const InjectedScript::Scope& m_scope;
 
    // V8 引擎隔离区。
    v8::Isolate* m_isolate;
 
    // 取消令牌。
    std::shared_ptr<CancelToken> m_cancelToken;
  };
 
 private:
  // 实现连接逻辑。
  V8InspectorSessionImpl* connectImpl(int contextGroupId, V8Inspector::Channel*,
                                      StringView state, ClientTrustLevel,
                                      SessionPauseState);
 
  // V8 引擎隔离区。
  v8::Isolate* m_isolate;
 
  // 客户端对象。
  V8InspectorClient* m_client;
 
  // 调试器对象。
  std::unique_ptr<V8Debugger> m_debugger;
 
  // 正则表达式上下文。
  v8::Global<v8::Context> m_regexContext;
 
  // 异常元数据上下文。
  v8::Global<v8::Context> m_exceptionMetaDataContext;
 
  // 异常元数据表。
  v8::Global<v8::debug::EphemeronTable> m_exceptionMetaData;
 
  // 上一个异常 ID。
  unsigned m_lastExceptionId;
 
  // 上一个上下文 ID。
  int m_lastContextId;
 
  // 上一个会话 ID。
  int m_lastSessionId = 0;
 
  // 静音异常的映射表(上下文组 ID -> 静音级别)。
  using MuteExceptionsMap = std::unordered_map<int, int>;
  MuteExceptionsMap m_muteExceptionsMap;
 
  // 上下文映射表(上下文 ID -> 被检查的上下文对象)。
  using ContextByIdMap =
      std::unordered_map<int, std::unique_ptr<InspectedContext>>;
 
  // 上下文组映射表(上下文组 ID -> 上下文映射表)。
  using ContextsByGroupMap =
      std::unordered_map<int, std::unique_ptr<ContextByIdMap>>;
  ContextsByGroupMap m_contexts;
 
  // 会话映射表(上下文组 ID -> 会话 ID -> 调试会话对象)。
  std::unordered_map<int, std::map<int, V8InspectorSessionImpl*>> m_sessions;
 
  // 调试器屏障映射表(上下文组 ID -> 调试器屏障)。
  std::unordered_map<int, std::weak_ptr<V8DebuggerBarrier>> m_debuggerBarriers;
 
  // 控制台消息存储映射表(上下文组 ID -> 控制台消息存储对象)。
  using ConsoleStorageMap =
      std::unordered_map<int, std::unique_ptr<V8ConsoleMessageStorage>>;
  ConsoleStorageMap m_consoleStorageMap;
 
  // 上下文 ID 到上下文组 ID 的映射表。
  std::unordered_map<int, int> m_contextIdToGroupIdMap;
 
  // 唯一 ID 到上下文 ID 的映射表。
  std::map<std::pair<int64_t, int64_t>, int> m_uniqueIdToContextId;
 
  // 控制台对象。
  std::unique_ptr<V8Console> m_console;
 
  // Promise 处理器跟踪器。
  PromiseHandlerTracker m_promiseHandlerTracker;
};
class V8InspectorImpl : public V8Inspector {
 public:
  V8_EXPORT_PRIVATE V8InspectorImpl(v8::Isolate*, V8InspectorClient*);
  ~V8InspectorImpl() override;
 
  // 禁止拷贝构造和赋值操作,避免对象被拷贝。
  V8InspectorImpl(const V8InspectorImpl&) = delete;
  V8InspectorImpl& operator=(const V8InspectorImpl&) = delete;
 
  // 获取当前的 V8 引擎隔离区。
  v8::Isolate* isolate() const { return m_isolate; }
 
  // 获取与该 Inspector 关联的客户端。
  V8InspectorClient* client() { return m_client; }
 
  // 获取调试器对象。
  V8Debugger* debugger() { return m_debugger.get(); }
 
  // 获取 Promise 处理器跟踪器。
  PromiseHandlerTracker& promiseHandlerTracker() {
    return m_promiseHandlerTracker;
  }
 
  // 根据上下文对象获取上下文组 ID。
  int contextGroupId(v8::Local<v8::Context>) const;
 
  // 根据上下文 ID 获取上下文组 ID。
  int contextGroupId(int contextId) const;
 
  // 根据唯一 ID 解析上下文 ID。
  int resolveUniqueContextId(internal::V8DebuggerId uniqueId) const;
 
  // 编译并运行内部脚本。
  v8::MaybeLocal<v8::Value> compileAndRunInternalScript(v8::Local<v8::Context>,
                                                        v8::Local<v8::String>);
 
  // 编译脚本。
  v8::MaybeLocal<v8::Script> compileScript(v8::Local<v8::Context>,
                                           const String16& code,
                                           const String16& fileName);
 
  // 获取正则表达式上下文。
  v8::MaybeLocal<v8::Context> regexContext();
 
  // 获取异常元数据上下文。
  v8::MaybeLocal<v8::Context> exceptionMetaDataContext();
 
  // 连接到调试会话,返回一个独立的会话对象。
  std::unique_ptr<V8InspectorSession> connect(int contextGroupId,
                                              V8Inspector::Channel*,
                                              StringView state,
                                              ClientTrustLevel,
                                              SessionPauseState) override;
 
  // 连接到调试会话,返回一个共享的会话对象。
  std::shared_ptr<V8InspectorSession> connectShared(int contextGroupId,
                                                    V8Inspector::Channel*,
                                                    StringView state,
                                                    ClientTrustLevel,
                                                    SessionPauseState) override;
 
  // 通知上下文创建。
  void contextCreated(const V8ContextInfo&) override;
 
  // 通知上下文销毁。
  void contextDestroyed(v8::Local<v8::Context>) override;
 
  // 根据上下文 ID 获取上下文对象。
  v8::MaybeLocal<v8::Context> contextById(int contextId) override;
 
  // 获取上下文的唯一调试器 ID。
  V8DebuggerId uniqueDebuggerId(int contextId) override;
 
  // 获取隔离区的唯一 ID。
  uint64_t isolateId() override;
 
  // 通知上下文被回收。
  void contextCollected(int contextGroupId, int contextId);
 
  // 重置上下文组。
  void resetContextGroup(int contextGroupId) override;
 
  // 通知空闲状态开始。
  void idleStarted() override;
 
  // 通知空闲状态结束。
  void idleFinished() override;
 
  // 通知异常被抛出。
  unsigned exceptionThrown(v8::Local<v8::Context>, StringView message,
                           v8::Local<v8::Value> exception,
                           StringView detailedMessage, StringView url,
                           unsigned lineNumber, unsigned columnNumber,
                           std::unique_ptr<V8StackTrace>,
                           int scriptId) override;
 
  // 通知异常被撤销。
  void exceptionRevoked(v8::Local<v8::Context>, unsigned exceptionId,
                        StringView message) override;
 
  // 创建堆栈跟踪。
  std::unique_ptr<V8StackTrace> createStackTrace(
      v8::Local<v8::StackTrace>) override;
 
  // 捕获当前堆栈跟踪。
  std::unique_ptr<V8StackTrace> captureStackTrace(bool fullStack) override;
 
  // 通知异步任务被调度。
  void asyncTaskScheduled(StringView taskName, void* task,
                          bool recurring) override;
 
  // 通知异步任务被取消。
  void asyncTaskCanceled(void* task) override;
 
  // 通知异步任务开始。
  void asyncTaskStarted(void* task) override;
 
  // 通知异步任务结束。
  void asyncTaskFinished(void* task) override;
 
  // 通知所有异步任务被取消。
  void allAsyncTasksCanceled() override;
 
  // 存储当前堆栈跟踪。
  V8StackTraceId storeCurrentStackTrace(StringView description) override;
 
  // 通知外部异步任务开始。
  void externalAsyncTaskStarted(const V8StackTraceId& parent) override;
 
  // 通知外部异步任务结束。
  void externalAsyncTaskFinished(const V8StackTraceId& parent) override;
 
  // 关联异常数据。
  V8_EXPORT_PRIVATE bool associateExceptionData(
      v8::Local<v8::Context>, v8::Local<v8::Value> exception,
      v8::Local<v8::Name> key, v8::Local<v8::Value> value) override;
 
  // 获取下一个异常 ID。
  unsigned nextExceptionId() { return ++m_lastExceptionId; }
 
  // 静音指定上下文组的异常。
  void muteExceptions(int contextGroupId);
 
  // 取消静音指定上下文组的异常。
  void unmuteExceptions(int contextGroupId);
 
  // 确保指定上下文组有控制台消息存储。
  V8ConsoleMessageStorage* ensureConsoleMessageStorage(int contextGroupId);
 
  // 检查指定上下文组是否有控制台消息存储。
  bool hasConsoleMessageStorage(int contextGroupId);
 
  // 丢弃被检查的上下文。
  void discardInspectedContext(int contextGroupId, int contextId);
 
  // 断开与调试会话的连接。
  void disconnect(V8InspectorSessionImpl*);
 
  // 根据上下文组 ID 和会话 ID 获取调试会话。
  V8InspectorSessionImpl* sessionById(int contextGroupId, int sessionId);
 
  // 根据上下文 ID 获取被检查的上下文。
  InspectedContext* getContext(int groupId, int contextId) const;
 
  // 根据上下文 ID 获取被检查的上下文。
  InspectedContext* getContext(int contextId) const;
 
  // 获取控制台对象。
  V8_EXPORT_PRIVATE V8Console* console();
 
  // 遍历指定上下文组的所有上下文。
  void forEachContext(int contextGroupId,
                      const std::function<void(InspectedContext*)>& callback);
 
  // 遍历指定上下文组的所有调试会话。
  void forEachSession(
      int contextGroupId,
      const std::function<void(V8InspectorSessionImpl*)>& callback);
 
  // 生成唯一 ID。
  int64_t generateUniqueId();
 
  // 获取与异常关联的数据。
  V8_EXPORT_PRIVATE v8::MaybeLocal<v8::Object> getAssociatedExceptionData(
      v8::Local<v8::Value> exception);
 
  // 获取与异常关联的数据(协议格式)。
  std::unique_ptr<protocol::DictionaryValue>
  getAssociatedExceptionDataForProtocol(v8::Local<v8::Value> exception);
 
  // EvaluateScope 类用于在特定作用域内执行脚本。
  class EvaluateScope {
   public:
    // 构造函数,初始化作用域。
    explicit EvaluateScope(const InjectedScript::Scope& scope);
 
    // 析构函数,清理资源。
    ~EvaluateScope();
 
    // 设置超时时间。
    protocol::Response setTimeout(double timeout);
 
   private:
    // 内部类和结构体,用于实现超时终止功能。
    class TerminateTask;
    struct CancelToken;
 
    // 作用域对象。
    const InjectedScript::Scope& m_scope;
 
    // V8 引擎隔离区。
    v8::Isolate* m_isolate;
 
    // 取消令牌。
    std::shared_ptr<CancelToken> m_cancelToken;
  };
 
 private:
  // 实现连接逻辑。
  V8InspectorSessionImpl* connectImpl(int contextGroupId, V8Inspector::Channel*,
                                      StringView state, ClientTrustLevel,
                                      SessionPauseState);
 
  // V8 引擎隔离区。
  v8::Isolate* m_isolate;
 
  // 客户端对象。
  V8InspectorClient* m_client;
 
  // 调试器对象。
  std::unique_ptr<V8Debugger> m_debugger;
 
  // 正则表达式上下文。
  v8::Global<v8::Context> m_regexContext;
 
  // 异常元数据上下文。
  v8::Global<v8::Context> m_exceptionMetaDataContext;
 
  // 异常元数据表。
  v8::Global<v8::debug::EphemeronTable> m_exceptionMetaData;
 
  // 上一个异常 ID。
  unsigned m_lastExceptionId;
 
  // 上一个上下文 ID。
  int m_lastContextId;
 
  // 上一个会话 ID。
  int m_lastSessionId = 0;
 
  // 静音异常的映射表(上下文组 ID -> 静音级别)。
  using MuteExceptionsMap = std::unordered_map<int, int>;
  MuteExceptionsMap m_muteExceptionsMap;
 
  // 上下文映射表(上下文 ID -> 被检查的上下文对象)。
  using ContextByIdMap =
      std::unordered_map<int, std::unique_ptr<InspectedContext>>;
 
  // 上下文组映射表(上下文组 ID -> 上下文映射表)。
  using ContextsByGroupMap =
      std::unordered_map<int, std::unique_ptr<ContextByIdMap>>;
  ContextsByGroupMap m_contexts;
 
  // 会话映射表(上下文组 ID -> 会话 ID -> 调试会话对象)。
  std::unordered_map<int, std::map<int, V8InspectorSessionImpl*>> m_sessions;
 
  // 调试器屏障映射表(上下文组 ID -> 调试器屏障)。
  std::unordered_map<int, std::weak_ptr<V8DebuggerBarrier>> m_debuggerBarriers;
 
  // 控制台消息存储映射表(上下文组 ID -> 控制台消息存储对象)。
  using ConsoleStorageMap =
      std::unordered_map<int, std::unique_ptr<V8ConsoleMessageStorage>>;
  ConsoleStorageMap m_consoleStorageMap;
 
  // 上下文 ID 到上下文组 ID 的映射表。
  std::unordered_map<int, int> m_contextIdToGroupIdMap;
 
  // 唯一 ID 到上下文 ID 的映射表。
  std::map<std::pair<int64_t, int64_t>, int> m_uniqueIdToContextId;
 
  // 控制台对象。
  std::unique_ptr<V8Console> m_console;
 
  // Promise 处理器跟踪器。
  PromiseHandlerTracker m_promiseHandlerTracker;
};
class V8InspectorSessionImpl : public V8InspectorSession,
                               public protocol::FrontendChannel {
 public:
  // 静态工厂方法,用于创建 V8InspectorSessionImpl 对象。
  static V8InspectorSessionImpl* create(
      V8InspectorImpl*, int contextGroupId, int sessionId,
      V8Inspector::Channel*, StringView state,
      v8_inspector::V8Inspector::ClientTrustLevel,
      std::shared_ptr<V8DebuggerBarrier>);
 
  ~V8InspectorSessionImpl() override;
 
  // 禁止拷贝构造和赋值操作,避免对象被拷贝。
  V8InspectorSessionImpl(const V8InspectorSessionImpl&) = delete;
  V8InspectorSessionImpl& operator=(const V8InspectorSessionImpl&) = delete;
 
  // 获取与该会话关联的 Inspector 实例。
  V8InspectorImpl* inspector() const { return m_inspector; }
 
  // 获取控制台代理。
  V8ConsoleAgentImpl* consoleAgent() { return m_consoleAgent.get(); }
 
  // 获取调试器代理。
  V8DebuggerAgentImpl* debuggerAgent() { return m_debuggerAgent.get(); }
 
  // 获取 Schema 代理。
  V8SchemaAgentImpl* schemaAgent() { return m_schemaAgent.get(); }
 
  // 获取性能分析代理。
  V8ProfilerAgentImpl* profilerAgent() { return m_profilerAgent.get(); }
 
  // 获取运行时代理。
  V8RuntimeAgentImpl* runtimeAgent() { return m_runtimeAgent.get(); }
 
  // 获取堆性能分析代理。
  V8HeapProfilerAgentImpl* heapProfilerAgent() {
    return m_heapProfilerAgent.get();
  }
 
  // 获取上下文组 ID。
  int contextGroupId() const { return m_contextGroupId; }
 
  // 获取会话 ID。
  int sessionId() const { return m_sessionId; }
 
  // 查找注入脚本。
  Response findInjectedScript(int contextId, InjectedScript*&);
 
  // 根据 RemoteObjectId 查找注入脚本。
  Response findInjectedScript(RemoteObjectIdBase*, InjectedScript*&);
 
  // 重置会话状态。
  void reset();
 
  // 丢弃所有注入脚本。
  void discardInjectedScripts();
 
  // 报告所有上下文信息。
  void reportAllContexts(V8RuntimeAgentImpl*);
 
  // 设置自定义对象格式化器是否启用。
  void setCustomObjectFormatterEnabled(bool);
 
  // 将 V8 值包装为远程对象。
  std::unique_ptr<protocol::Runtime::RemoteObject> wrapObject(
      v8::Local<v8::Context>, v8::Local<v8::Value>, const String16& groupName,
      bool generatePreview);
 
  // 将表格数据包装为远程对象。
  std::unique_ptr<protocol::Runtime::RemoteObject> wrapTable(
      v8::Local<v8::Context>, v8::Local<v8::Object> table,
      v8::MaybeLocal<v8::Array> columns);
 
  // 获取支持的协议域。
  std::vector<std::unique_ptr<protocol::Schema::Domain>> supportedDomainsImpl();
 
  // 解包远程对象。
  Response unwrapObject(const String16& objectId, v8::Local<v8::Value>*,
                        v8::Local<v8::Context>*, String16* objectGroup);
 
  // 释放对象组。
  void releaseObjectGroup(const String16& objectGroup);
 
  // V8InspectorSession 接口的实现。
  void dispatchProtocolMessage(StringView message) override;
  std::vector<uint8_t> state() override;
  std::vector<std::unique_ptr<protocol::Schema::API::Domain>> supportedDomains()
      override;
  void addInspectedObject(
      std::unique_ptr<V8InspectorSession::Inspectable>) override;
  void schedulePauseOnNextStatement(StringView breakReason,
                                    StringView breakDetails) override;
  void cancelPauseOnNextStatement() override;
  void breakProgram(StringView breakReason, StringView breakDetails) override;
  void setSkipAllPauses(bool) override;
  void resume(bool terminateOnResume = false) override;
  void stepOver() override;
  std::vector<std::unique_ptr<protocol::Debugger::API::SearchMatch>>
  searchInTextByLines(StringView text, StringView query, bool caseSensitive,
                      bool isRegex) override;
  void releaseObjectGroup(StringView objectGroup) override;
  bool unwrapObject(std::unique_ptr<StringBuffer>*, StringView objectId,
                    v8::Local<v8::Value>*, v8::Local<v8::Context>*,
                    std::unique_ptr<StringBuffer>* objectGroup) override;
  std::unique_ptr<protocol::Runtime::API::RemoteObject> wrapObject(
      v8::Local<v8::Context>, v8::Local<v8::Value>, StringView groupName,
      bool generatePreview) override;
 
  // 获取被检查的对象。
  V8InspectorSession::Inspectable* inspectedObject(unsigned num);
 
  // 被检查对象缓冲区大小。
  static const unsigned kInspectedObjectBufferSize = 5;
 
  // 触发精确覆盖增量更新。
  void triggerPreciseCoverageDeltaUpdate(StringView occasion) override;
 
  // 在上下文中评估表达式。
  EvaluateResult evaluate(v8::Local<v8::Context> context, StringView expression,
                           bool includeCommandLineAPI = false) override;
 
  // 停止会话。
  void stop() override;
 
  // 获取客户端信任级别。
  V8Inspector::ClientTrustLevel clientTrustLevel() {
    return m_clientTrustLevel;
  }
 
  // 设置弱引用的 this 指针。
  void setWeakThis(std::weak_ptr<V8InspectorSessionImpl> weakThis) {
    m_weakThis = std::move(weakThis);
  }
 
 private:
  // 私有构造函数,仅通过 create 方法创建对象。
  V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, int sessionId,
                         V8Inspector::Channel*, StringView state,
                         V8Inspector::ClientTrustLevel,
                         std::shared_ptr<V8DebuggerBarrier>);
 
  // 获取代理的状态字典。
  protocol::DictionaryValue* agentState(const String16& name);
 
  // protocol::FrontendChannel 接口的实现。
  void SendProtocolResponse(
      int callId, std::unique_ptr<protocol::Serializable> message) override;
  void SendProtocolNotification(
      std::unique_ptr<protocol::Serializable> message) override;
  void FallThrough(int callId, v8_crdtp::span<uint8_t> method,
                   v8_crdtp::span<uint8_t> message) override;
  void FlushProtocolNotifications() override;
 
  // 序列化消息以发送到前端。
  std::unique_ptr<StringBuffer> serializeForFrontend(
      std::unique_ptr<protocol::Serializable> message);
 
  // 上下文组 ID。
  int m_contextGroupId;
 
  // 会话 ID。
  int m_sessionId;
 
  // 关联的 Inspector 实例。
  V8InspectorImpl* m_inspector;
 
  // 通信通道。
  V8Inspector::Channel* m_channel;
 
  // 是否启用自定义对象格式化器。
  bool m_customObjectFormatterEnabled;
 
  // 协议分发器。
  protocol::UberDispatcher m_dispatcher;
 
  // 会话状态。
  std::unique_ptr<protocol::DictionaryValue> m_state;
 
  // 运行时代理。
  std::unique_ptr<V8RuntimeAgentImpl> m_runtimeAgent;
 
  // 调试器代理。
  std::unique_ptr<V8DebuggerAgentImpl> m_debuggerAgent;
 
  // 堆性能分析代理。
  std::unique_ptr<V8HeapProfilerAgentImpl> m_heapProfilerAgent;
 
  // 性能分析代理。
  std::unique_ptr<V8ProfilerAgentImpl> m_profilerAgent;
 
  // 控制台代理。
  std::unique_ptr<V8ConsoleAgentImpl> m_consoleAgent;
 
  // Schema 代理。
  std::unique_ptr<V8SchemaAgentImpl> m_schemaAgent;
 
  // 被检查的对象列表。
  std::vector<std::unique_ptr<V8InspectorSession::Inspectable>>
      m_inspectedObjects;
 
  // 是否使用二进制协议。
  bool use_binary_protocol_ = false;
 
  // 客户端信任级别。
  V8Inspector::ClientTrustLevel m_clientTrustLevel = V8Inspector::kUntrusted;
 
  // 用于在 dispatchProtocolMessage 调用中保持会话对象存活的作用域类。
  class KeepSessionAliveScope {
   public:
    explicit KeepSessionAliveScope(const V8InspectorSessionImpl& session)
        : m_this(session.m_weakThis.lock()) {}
 
   private:
    std::shared_ptr<V8InspectorSessionImpl> m_this;
  };
 
  // 用于在嵌套运行循环中保持会话对象存活的弱引用。
  std::weak_ptr<V8InspectorSessionImpl> m_weakThis;
};
class V8InspectorSessionImpl : public V8InspectorSession,
                               public protocol::FrontendChannel {
 public:
  // 静态工厂方法,用于创建 V8InspectorSessionImpl 对象。
  static V8InspectorSessionImpl* create(
      V8InspectorImpl*, int contextGroupId, int sessionId,
      V8Inspector::Channel*, StringView state,
      v8_inspector::V8Inspector::ClientTrustLevel,
      std::shared_ptr<V8DebuggerBarrier>);
 
  ~V8InspectorSessionImpl() override;
 
  // 禁止拷贝构造和赋值操作,避免对象被拷贝。
  V8InspectorSessionImpl(const V8InspectorSessionImpl&) = delete;
  V8InspectorSessionImpl& operator=(const V8InspectorSessionImpl&) = delete;
 
  // 获取与该会话关联的 Inspector 实例。
  V8InspectorImpl* inspector() const { return m_inspector; }
 
  // 获取控制台代理。
  V8ConsoleAgentImpl* consoleAgent() { return m_consoleAgent.get(); }
 
  // 获取调试器代理。
  V8DebuggerAgentImpl* debuggerAgent() { return m_debuggerAgent.get(); }
 
  // 获取 Schema 代理。
  V8SchemaAgentImpl* schemaAgent() { return m_schemaAgent.get(); }
 
  // 获取性能分析代理。
  V8ProfilerAgentImpl* profilerAgent() { return m_profilerAgent.get(); }
 
  // 获取运行时代理。
  V8RuntimeAgentImpl* runtimeAgent() { return m_runtimeAgent.get(); }
 
  // 获取堆性能分析代理。
  V8HeapProfilerAgentImpl* heapProfilerAgent() {
    return m_heapProfilerAgent.get();
  }
 
  // 获取上下文组 ID。
  int contextGroupId() const { return m_contextGroupId; }
 
  // 获取会话 ID。
  int sessionId() const { return m_sessionId; }
 
  // 查找注入脚本。
  Response findInjectedScript(int contextId, InjectedScript*&);
 
  // 根据 RemoteObjectId 查找注入脚本。
  Response findInjectedScript(RemoteObjectIdBase*, InjectedScript*&);
 
  // 重置会话状态。
  void reset();
 
  // 丢弃所有注入脚本。
  void discardInjectedScripts();
 
  // 报告所有上下文信息。
  void reportAllContexts(V8RuntimeAgentImpl*);
 
  // 设置自定义对象格式化器是否启用。
  void setCustomObjectFormatterEnabled(bool);
 
  // 将 V8 值包装为远程对象。
  std::unique_ptr<protocol::Runtime::RemoteObject> wrapObject(
      v8::Local<v8::Context>, v8::Local<v8::Value>, const String16& groupName,
      bool generatePreview);
 
  // 将表格数据包装为远程对象。
  std::unique_ptr<protocol::Runtime::RemoteObject> wrapTable(
      v8::Local<v8::Context>, v8::Local<v8::Object> table,
      v8::MaybeLocal<v8::Array> columns);
 
  // 获取支持的协议域。
  std::vector<std::unique_ptr<protocol::Schema::Domain>> supportedDomainsImpl();
 
  // 解包远程对象。
  Response unwrapObject(const String16& objectId, v8::Local<v8::Value>*,
                        v8::Local<v8::Context>*, String16* objectGroup);
 
  // 释放对象组。
  void releaseObjectGroup(const String16& objectGroup);
 
  // V8InspectorSession 接口的实现。
  void dispatchProtocolMessage(StringView message) override;
  std::vector<uint8_t> state() override;
  std::vector<std::unique_ptr<protocol::Schema::API::Domain>> supportedDomains()
      override;
  void addInspectedObject(
      std::unique_ptr<V8InspectorSession::Inspectable>) override;
  void schedulePauseOnNextStatement(StringView breakReason,
                                    StringView breakDetails) override;
  void cancelPauseOnNextStatement() override;
  void breakProgram(StringView breakReason, StringView breakDetails) override;
  void setSkipAllPauses(bool) override;
  void resume(bool terminateOnResume = false) override;
  void stepOver() override;
  std::vector<std::unique_ptr<protocol::Debugger::API::SearchMatch>>
  searchInTextByLines(StringView text, StringView query, bool caseSensitive,
                      bool isRegex) override;
  void releaseObjectGroup(StringView objectGroup) override;
  bool unwrapObject(std::unique_ptr<StringBuffer>*, StringView objectId,
                    v8::Local<v8::Value>*, v8::Local<v8::Context>*,
                    std::unique_ptr<StringBuffer>* objectGroup) override;
  std::unique_ptr<protocol::Runtime::API::RemoteObject> wrapObject(
      v8::Local<v8::Context>, v8::Local<v8::Value>, StringView groupName,
      bool generatePreview) override;
 
  // 获取被检查的对象。
  V8InspectorSession::Inspectable* inspectedObject(unsigned num);
 
  // 被检查对象缓冲区大小。
  static const unsigned kInspectedObjectBufferSize = 5;
 
  // 触发精确覆盖增量更新。
  void triggerPreciseCoverageDeltaUpdate(StringView occasion) override;
 
  // 在上下文中评估表达式。
  EvaluateResult evaluate(v8::Local<v8::Context> context, StringView expression,
                           bool includeCommandLineAPI = false) override;
 
  // 停止会话。
  void stop() override;
 
  // 获取客户端信任级别。
  V8Inspector::ClientTrustLevel clientTrustLevel() {
    return m_clientTrustLevel;
  }
 
  // 设置弱引用的 this 指针。
  void setWeakThis(std::weak_ptr<V8InspectorSessionImpl> weakThis) {
    m_weakThis = std::move(weakThis);
  }
 
 private:
  // 私有构造函数,仅通过 create 方法创建对象。
  V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, int sessionId,
                         V8Inspector::Channel*, StringView state,
                         V8Inspector::ClientTrustLevel,
                         std::shared_ptr<V8DebuggerBarrier>);
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2025-6-7 18:21 被nothing233编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (1)
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-6-7 20:23
0
游客
登录 | 注册 方可回帖
返回