-
-
[原创]V8 Inspector 看这一篇就够了
-
发表于: 2025-6-7 18:04 3883
-
这篇文章将带大家从宏观把握 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_channel 的 sendResponse 发送, 脱离 V8 Inspector 体系, 到了 third_party/blink/renderer/core/inspector/devtools_session.cc 中, 我们也到此为止, 不在继续。
e62K9s2c8@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>);[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
赞赏
- [原创]LLVM: ADCEPass 1328
- [原创]llvm: InstSimplifyPass 2607
- [原创]一个 ELF 文件的运行 29884
- [原创]capstone学习: 反汇编器如何实现的 12715
- [原创]chromium 的启动 2374