chromium log相关

如何在Chromium中打开并使用日志功能
本文详细介绍了如何在Chromium浏览器的非debug版本中打开并使用日志功能,包括如何在命令行中配置日志通道以及如何在release版本中自定义日志宏。

如何打开chromium里面的log?


我们看到代码里面很多LOG(),所以要先找到LOG的定义。

LOG定义在Assertions.h里面。LOG是由条件宏控制的


如果非debug版本,如下代码

#ifdef NDEBUG //release版本会定义NDEBUG=1
/* Disable ASSERT* macros in release mode. */
#define ASSERTIONS_DISABLED_DEFAULT 1
#else
#define ASSERTIONS_DISABLED_DEFAULT 0
#endif


LOG宏定义如下

/* LOG */

#if COMPILER(MSVC7_OR_LOWER)
#define LOG() ((void)0)
#elif COMPILER(WINSCW)
#define LOG(arg...) ((void)0)
#elif LOG_DISABLED
#define LOG(channel, ...) ((void)0)
#else
#define LOG(channel, ...) WTFLog(&JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__)
#define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel)
#define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel
#endif


由于LOG_DISABLED就是1,LOG就是void


即使debug版本,LOG如果要输出,还需要打开channel。channel的打开需要命令行里面加上 "--webcore-log-channels",后跟要打开的channel

代码如下

WebKitThread::InternalWebKitThread::Init
	  webkit_glue::EnableWebCoreLogChannels(
      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
          switches::kWebCoreLogChannels));


太麻烦了

在release版本里面,我们自己定义LOG吧

简单定义

#undef LOG
#define LOG(channel, ...) \
do { \
printf(__VA_ARGS__); \
printf("\n"); \
} while(0)

### Chromium 浏览器的线程模型与多进程架构 #### 线程模型概述 在Chromium浏览器中,为了提高稳定性和安全性,采用了复杂的线程和进程管理机制。Browser进程作为核心控制单元,内部包含了多个重要线程来分工协作完成不同任务[^5]。 - **UI线程**:主要负责处理用户界面交互事件以及部分页面加载逻辑; - **IO线程**:用于网络请求和其他输入输出操作;当接收到HTTP响应或其他数据流时,由该线程进一步传递至相应模块; - **渲染线程**:位于单独的渲染进程中,专注于网页内容呈现工作流程,包括但不限于HTML解析、样式计算、JavaScript解释执行等环节。 #### 渲染进程间的通信桥梁——RenderProcessHost 对于每一个活跃标签页而言,在浏览器端都会创建一个`RenderProcessHost`实例与其对应的一个或多个渲染子进程相连接。这种设计不仅实现了良好的隔离效果,还便于跨平台移植和发展新特性[^3]。 ```cpp // 创建 RenderProcessHost 的简化伪代码表示 class Browser { public: void CreateNewTab() { auto* host = new RenderProcessHost(this); // ... } }; ``` #### 高度解耦的服务化架构转型 自2016年起,Chromium团队引入了面向服务的设计理念(SOA),旨在打造更加模块化的软件体系结构。这使得各个功能部件能够像微服务一样独立运作却又紧密配合,既增强了系统的灵活性也降低了维护成本[^4]。 例如,在高性能硬件环境下可以充分利用多核CPU优势启动更多辅助进程;而在低端配置下则适当减少不必要的分离程度以节约宝贵资源。 #### 页面展示的具体流程 具体来说,从用户发起访问指令开始直到最终看到完整的Web文档视图为止,整个过程中涉及到多次线程切换: 1. 用户点击链接或者地址栏提交查询后,信息先到达Browser进程内的UI线程; 2. 经过初步分析判断之后转发给专门从事外部通讯工作的IO线程去获取目标网址的数据包; 3. 数据返回后再经由`RendererHost`接口传达给指定的渲染进程里的主线程(即渲染线程); 4. 接下来就是一系列关于DOM构建、样式应用直至图形绘制的操作步骤; 5. 完成后的位图会被送回Browser侧并通过共享内存技术显示出来。 ```javascript // JavaScript 执行环境下的异步调用示意 fetch('https://example.com/data') .then(response => response.json()) .then(data => console.log(data)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值