转自:http://blog.csdn.net/kuerjinjin/article/details/43937345

简介

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

1.从content shell开始

多数人首次接触chromium都感觉这个项目太过于庞大,总是有无从下手的感脚; 
如果我们想抛开它原有的界面单纯的去了解一下它怎么显示网页的?那么通过content api来了解chromium是一个不错的选择。

项目解决方案生成成功以后,我们可以从src\content\content_shell_and_tests.sln开始,设置content_shell项目为“启动项目”开始编译调试,具体打开content_shell_lib项目了解;界面很简单,界面上的简单布局我们可以从src\content\shell\browser\shell_views.cc了解到。 
我们可以自己去改一下看看效果,比如改一下初始的窗口位置大小: 
修改PlatformCreateWindow方法中的params.bounds

params.bounds = gfx::Rect(40, 40, width, height);
  • 1

找到src\content\shell\browser\shell.cc修改一下:

const int Shell::kDefaultTestWindowWidthDip = GetSystemMetrics(SM_CXSCREEN) - 160;
const int Shell::kDefaultTestWindowHeightDip = GetSystemMetrics(SM_CYSCREEN) - 160;
  • 1
  • 2

编译完成后看看是不是顺眼多了?首次启动要显示的网页我们也可以从src\content\shell\browser\shell_browser_main_parts.cc 
GetStartupURL方法做个修改,默认没有参数的时候打开的网页:

  if (args.empty())
return GURL("http://www.baidu.com/");
  • 1
  • 2

再或者我们修改一下用户数据的位置src\content\shell\browser\shell_browser_context.ccInitWhileIOAllowed方法中:

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

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

补充几点: 
1.为了方便查看生成后的文件可以单独设置生成目录为src\out_content_shell

python  src\build\gyp_chromium -Goutput_dir=out_content_shell
  • 1

2.基本的依赖文件就只有“content_shell.exe”,“content_shell.pak”和“icudtl.dat”。 
当然你如果把原有的views\controls以及开发者工具等用到的资源等去掉的话content_shell.pak也可以进一步干掉;如果要保留对一些HTML5特性的支持的话d3dcompiler_46.dll,ffmpegsumo.dll,libEGL.dll ,libGLESv2.dll 也是可以保留的!


2.初步了解chromium中的LOG

content_shell.exe每次启动都会生成一个content_shell.log,这个文件的生成我们可以看一下src\content\shell\app\shell_main_delegate.cc中的InitLogging方法,这里就LOG的初始化有明确的演示:

  base::FilePath log_filename;
PathService::Get(base::DIR_EXE, &log_filename);
log_filename = log_filename.AppendASCII("content_shell.log");
logging::LoggingSettings settings;
// log输出的位置
settings.logging_dest = logging::LOG_TO_ALL;
// log的文件名
settings.log_file = log_filename.value().c_str();
// 是否锁定log文件
settings.delete_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宏可能不一样,新版本可能都会添加一下东西,具体的详细英文注释都可以查看src\base\logging.h


待续……

学会使用Chromium中的LOG的更多相关文章

  1. 【Chromium中文文档】线程

    线程 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Threading. ...

  2. [Android Pro] Android studio jni中调用Log输出调试信息

    reference to : http://www.linuxidc.com/Linux/2014-02/96341.htm Android 开发中,java 可以方便的使用调试信息Log.i, Lo ...

  3. android 中打 Log 的一些技巧

    在 android 平台上搞开发工作,会经常用到一些 Log 输出调试信息. 众所周知,android 中有五种类型的 Log , v, d, i, w, e 这里就不再赘 述 (如果对这些不了解的朋 ...

  4. Andoid java文件中的Log检查工具

    AndroidLogChecker 由于发布软件版本的时候我们需要把Log注释掉,此工具可以检查java类中的Log所在行以及是否已经注释. Github: https://github.com/cu ...

  5. 【Chromium中文文档】OS X 沙箱设计

    OS X 沙箱设计 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/OSX ...

  6. 【Chromium中文文档】沙箱FAQ

    沙箱FAQ 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox ...

  7. 【Chromium中文文档】Chrome/Chromium沙箱 - 安全架构设计

    沙箱 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox.ht ...

  8. 【Chromium中文文档】安全浏览 -- Chrome中的警告都是怎么来的?

    安全浏览 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/SafeBrow ...

  9. 【Chromium中文文档】Profile架构(看看谷歌家的重构)

    进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Profile_ ...

随机推荐

  1. Centos 5.x/6.x 配置163网易yum源

    Centos系统默认都是系统自带的yum源,国内用户用yum源安装比较慢,为了提高效率,一般我们会配置国内的yum源.国内比较好的yum源有网易yum源.搜狐yum源等. 我感觉网易的yum源比较好用 ...

  2. getshell工具

    目前支持64种CMS系统!全自动采集URL 全自动getshell 自动验证!!!

  3. 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1

    注:这里inc方法和dec方法加synchronized关键字是因为当两个线程同时操作同一个变量时,就算是简单的j++操作时,在系统底层也是通过多条机器语句来实现,所以在执行j++过程也是要耗费时间, ...

  4. Socket网络编程(3)--两端通信

    上篇博文:http://www.cnblogs.com/wolf-sun/p/3329558.html 介绍了客户端连接服务端,一对一,多对一的情况,下面实现服务器接收消息的功能.LZ这些弄的比较慢, ...

  5. StackExchange Redis如何实现BRPOP/BLPOP

    今天在使用StackExchange Redis客户端时.我想要使用BRPOP,但是我发现StackExchange Redis并没有提供API,没办法只好找资料看文档了. 原来StackExchan ...

  6. 移动端富文本编辑器artEditor

    摘要: 由于手机上打字比较慢,并不适合长篇大论的文章,所以移动端的富文本编辑器很少.artEditor是一款基于jQuery的移动端富文本编辑器,支持插入图片,后续完善其他功能. 插件地址:https ...

  7. Entity Framework 关系约束配置

    前言 简单的说一下自己的理解,大家应该都很明白ADO.NET,也就是原生态的数据库操作,直接通过拼接SQL语句,表与表之间通过链接(inner join  left join  或者子查询),也就是在 ...

  8. 解决 MySQL Cluster 通过 某一个MySqld节点新建表时,其他 MySqld节点 看不到表内容的问题

    问题: 总共有 4 个MySqld节点,通过其中的一个节点新建表时,发现其他 MySqld节点 查不到表内容的问题,即表没有同步过来. 解决方案: 主要是因为新建表时,所选的 表引擎 错误导致的,只能 ...

  9. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  10. [Effective JavaScript 笔记]第34条:在原型中存储方法

    js中完全有可能不借助原型进行编程.不用在其原型中定义任何的方法. 创建对象 构造函数法 所有属性和方法都在构造函数中定义 function User(name,pwd){ this.name=nam ...