学会使用Chromium中的LOG
转自: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.cc的InitWhileIOAllowed方法中:
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的更多相关文章
- 【Chromium中文文档】线程
线程 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Threading. ...
- [Android Pro] Android studio jni中调用Log输出调试信息
reference to : http://www.linuxidc.com/Linux/2014-02/96341.htm Android 开发中,java 可以方便的使用调试信息Log.i, Lo ...
- android 中打 Log 的一些技巧
在 android 平台上搞开发工作,会经常用到一些 Log 输出调试信息. 众所周知,android 中有五种类型的 Log , v, d, i, w, e 这里就不再赘 述 (如果对这些不了解的朋 ...
- Andoid java文件中的Log检查工具
AndroidLogChecker 由于发布软件版本的时候我们需要把Log注释掉,此工具可以检查java类中的Log所在行以及是否已经注释. Github: https://github.com/cu ...
- 【Chromium中文文档】OS X 沙箱设计
OS X 沙箱设计 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/OSX ...
- 【Chromium中文文档】沙箱FAQ
沙箱FAQ 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox ...
- 【Chromium中文文档】Chrome/Chromium沙箱 - 安全架构设计
沙箱 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Sandbox.ht ...
- 【Chromium中文文档】安全浏览 -- Chrome中的警告都是怎么来的?
安全浏览 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/SafeBrow ...
- 【Chromium中文文档】Profile架构(看看谷歌家的重构)
进程模型 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/Profile_ ...
随机推荐
- sockaddr & sockaddr_in struct
struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ ]; /* 14 bytes of protocol ...
- (转)也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
原文链接:http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/ 随着不同终端(pad/mobile/pc)的兴起 ...
- socket基本
fd_set用法: http://blog.sina.com.cn/s/blog_5c8d13830100erzs.htm socket连接: lpszHost="127.0.0.1&quo ...
- Bootstrap速学教程之简要介绍
Bootstrap是Twitter推出的一个用于前端开发的开源工具包,由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架,不用请UI设计师也能 ...
- java笔记--使用事件分配线程更新Swing控件
使用事件分配线程更新Swing控件: Swing并不是线程安全的,如果在多个线程中更新Swing控件,则很可能造成程序崩溃. 为了避免这种问题,可以使用时间分配线程来更新Swing控件. EventQ ...
- CSS3实现二十多种基本图形
CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...
- phpcms某处储存型XSS(demo+本地演示)
文章转载:http://www.myhack58.com/Article/html/3/7/2016/71726.htm 详细说明: demo+本地演示存在xss漏洞的地方在商务中心的商家资料的我的资 ...
- How to Configure Nginx for Optimized Performance
Features Pricing Add-ons Resources | Log in Sign up Guides & Tutorials Web Server Guides Nginx ...
- Html form 表单提交前验证
可以使用form表单的onsubmit方法,在提交表单之前,对表单或者网页中的数据进行检验. onsubmit指定的方法返回true,则提交数据:返回false不提交数据. 直接看下面的代码: 1 & ...
- vlan与交换机端口模式Access,Hybrid,Trunk
以太网端口有三种链路类型:Access.Hybrid和Trunk.Access类型的端口只能属于1个VLAN,一般用于连接计算机的端口:Trunk类型的端口可以允许多个VLAN通过,可以接收和发送多个 ...