2023年12月11日发(作者:)

学会使用Chromium中的LOG

简介

众所周知chromium项目无比巨大,想去快速的了解,调试并添加自己想要的功能,学会使用chromium中的LOG可以使你省很多

事儿!

1.从content shell开始

多数人首次接触chromium都感觉这个项目太过于庞大,总是有无从下手的感脚;

如果我们想抛开它原有的界面单纯的去了解一下它怎么显示网页的?那么通过content api来了解chromium是一个不错的选择。

项目解决方案生成成功以后,我们可以从srccontentcontent_shell_and_开始,设置content_shell项目为“启动项目”开始编译调试,

具体打开content_shell_lib项目了解;界面很简单,界面上的简单布局我们可以从srccontentshellbrowsershell_了解到。

我们可以自己去改一下看看效果,比如改一下初始的窗口位置大小:

修改PlatformCreateWindow方法中的

= gfx::Rect(40, 40, width, height);

1

找到修改一下:

const int Shell::kDefaultTestWindowWidthDip = GetSystemMetrics(SM_CXSCREEN) - 160;

const int Shell::kDefaultTestWindowHeightDip = GetSystemMetrics(SM_CYSCREEN) - 160;

1

2

编译完成后看看是不是顺眼多了?首次启动要显示的网页我们也可以从srccontentshellbrowsershell_browser_main_

的GetStartupURL方法做个修改,默认没有参数的时候打开的网页:

if (())

return GURL("/");

1

2

再或者我们修改一下用户数据的位置srccontentshellbrowsershell_browser_的InitWhileIOAllowed方法中:

CHECK(PathService::Get(base::DIR_MODULE, &path_));

1

将用户数据直接保存在程序目录等等;当然这些都不是重点,说这么多只是让你对content shell有一个初步的了解。

补充几点:

1.为了方便查看生成后的文件可以单独设置生成目录为srcout_content_shell

python srcbuildgyp_chromium -Goutput_dir=out_content_shell

1

2.基本的依赖文件就只有“content_”,“content_”和“”。

当然你如果把原有的viewscontrols以及开发者工具等用到的资源等去掉的话content_也可以进一步干掉;如果要保留对一些

HTML5特性的支持的话d3dcompiler_,, , 也是可以保留的!

2.初步了解chromium中的LOG

content_每次启动都会生成一个content_,这个文件的生成我们可以看一下srccontentshellappshell_main_

中的InitLogging方法,这里就LOG的初始化有明确的演示:

base::FilePath log_filename;

PathService::Get(base::DIR_EXE, &log_filename);

log_filename = log_ASCII("content_");

logging::LoggingSettings settings;

// log输出的位置

g_dest = logging::LOG_TO_ALL;

// log的文件名

_file = log_().c_str();

// 是否锁定log文件

_old = logging::DELETE_OLD_LOG_FILE;

logging::InitLogging(settings);

//log是否记录 [ 进程id,线程id,时间戳,精确时间 ]

logging::SetLogItems(true, true, true, true);

// 是否弹窗显示FATAL错误

logging::SetShowErrorDialogs(true);

// 设置断言错误回调函数,当Assert失败的时候会调用这个函数

//logging::SetLogAssertHandler(MyLogAssertHandler);

// 设置log回调函数,当输出log的时候会调用这个函数

//logging::SetLogMessageHandler(MyLogMessageHandler);

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

3.我们要学会使用的几个常用的LOG宏

1)LOG宏:

LOG就像c++标准库的输出一样重载<<,它有几个常用的等级,

像”VERBOSE“,“INFO”, “WARNING”, “ERROR”, “FATAL”,”NUM_SEVERITIES“等

比如”FATAL”LOG会触发一个断点,并打印出栈回溯信息。

LOG(INFO) << "info等级 = " << logging::LOG_INFO;

LOG(WARNING) << "WARNING等级 = " << logging::LOG_WARNING;

LOG(ERROR) << "ERROR等级 = " << logging::LOG_ERROR;

LOG(FATAL) << "FATAL等级 = " << logging::LOG_FATAL;

1

2

3

4

使用LOG_IF宏可以在表达式条件为真的情况下才输出log:

int if_int = 5;

LOG_IF(INFO, if_int < 10 ) << "if_int < 10";

1

2

CHECK宏在表达式为假的情况下执行LOG(FATAL)的效果,

如果没有附加调试器,还会生成一个crash dump。

//CHECK宏,条件失败则产生一个LOG(FATAL)

CHECK(0);

1

2

2)DLOG宏:

DLOG跟LOG类似,不同的是DLOG只在DEBUG模式下才生效,

在非DEBUG模式下,这部分代码都不会被编译进程序。

DLOG(INFO) << "DLOG onlg debug";

DLOG_IF(INFO, if_int < 10) << "DLOG_IF onlg debug";

LOG_ASSERT(0);

DLOG_ASSERT(0);

1

2

3

4

3)VLOG宏:

这是一种可以通过命令行参数动态调整输出log策略的宏,这些宏都是INFO级别的。

4)PLOG宏:

这中宏除了输出我们指定的输出信息,后面还附加有系统最后的错误信息,

windows上是GetLastError(),POSIX上是errno的值。

TIPS:每个版本的LOG宏可能不一样,新版本可能都会添加一下东西,具体的详细英文注释都可以查看srcbaselogging.h

待续……