• Chromium LOG(宏)


    转载来自:https://www.cnblogs.com/x_wukong/p/4821679.html

    1.从content shell开始

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

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

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

    找到srccontentshellrowsershell.cc修改一下:

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

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

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

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

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

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

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

    python  srcuildgyp_chromium -Goutput_dir=out_content_shell

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


    2.初步了解chromium中的LOG

    content_shell.exe每次启动都会生成一个content_shell.log,这个文件的生成我们可以看一下srccontentshellappshell_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);

    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;

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

      int if_int = 5;
      LOG_IF(INFO, if_int < 10 ) << "if_int < 10";

    CHECK宏在表达式为假的情况下执行LOG(FATAL)的效果, 
    如果没有附加调试器,还会生成一个crash dump。

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

    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);

    3)VLOG宏:

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

    4)PLOG宏: 

    这中宏除了输出我们指定的输出信息,后面还附加有系统最后的错误信息, 
    windows上是GetLastError(),POSIX上是errno的值。

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

  • 相关阅读:
    【Python】关于Python多线程的一篇文章转载
    【编码备份】1.9从Excel中导入用户名进行测试,用户一次进入系统进行答题测试。
    【实战】10.10.1.9考试系统代码完成一次答题代码备份
    Python几种并发实现方案的性能比较
    LoadRunner中获取当前系统时间方法
    [Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
    多少秒后跳转到指定页面
    浮动的三个特点很重要。
    HTML表格中<td scope="col">与<td scope="row">的含义
    简单编程思想
  • 原文地址:https://www.cnblogs.com/Galesaur-wcy/p/15356606.html
Copyright © 2020-2023  润新知