Nanolog起步笔记-9-log解压过程(3)寻找meta续

news2024/12/23 22:48:24

Nanolog起步笔记-9-log解压过程-3-寻找meta续

  • 当前的目标
    • 新的改变
    • decompressNextLogStatement
    • metadata
    • 查看业务面的log语句
    • 注释掉 runBenchmark();
      • 改过之后,2条记录之后,这里就直接返回了
    • 小结

当前的目标

没有办法,还要继续。
当前的目标,是找到解压时, meta 的信息。

注意,先备份一下/tmp/logFile到其它的位置。
因为clean,clean-all时会删除这个文件。
除非sample下和runtime下的两个GNUmakefile都改过。
如果没有备份,可能对分析有点影响。

新的改变

1。 launch.json
改为:decompressUnordered

        {
           "name": "C++ Launch decompressor",
           "type": "cppdbg",
           "request": "launch",
           "program": "${workspaceFolder}/sample/decompressor",
           "args": ["decompressUnordered","/tmp/logFile"],
           "environment": [{ "name": "config", "value": "Debug" }],
           "cwd": "${workspaceFolder}/sample",
           "setupCommands": [
               
               {
                   "description": "Enable pretty-printing for gdb",
                   "text": "-enable-pretty-printing",
                   "ignoreFailures": true
               }
           ]
       }

因为这样能路过许多不需要关注的代码。
我们目前也不需要sort。

decompressNextLogStatement

bool
Log::Decoder::BufferFragment::decompressNextLogStatement(FILE *outputFd,
                                        uint64_t &logMsgsProcessed,
                                        LogMessage &logArgs,
                                        const Checkpoint &checkpoint,
                                        std::vector<void*>& fmtId2metadata,
                                        long aggregationFilterId,
                                        void (*aggregationFn)(const char*, ...))
{
        // Output the context
        if (outputFd) {
            fprintf(outputFd,"%s.%09.0lf %s:%u %s[%u]: "
                    , timeString
                    , nanos
                    , filename
                    , metadata->lineNumber
                    , logLevel
                    , runtimeId);
            fflush(outputFd); //haoyujie
        }

如下图:
在这里插入图片描述说明:outputFd=stdout

在这里也卡了一小会,因为terminal中,没有输出。我想了半天,
问了下电脑,才发现自己大脑快down机,只是没有flush…
好吧,我加上了一句。为了调试。
这样我们第一次看到一个log的输出所在的位置。
之后我们可以向前研究,这个结果是如何得到的。

2024-12-10 16:23:46.000853307 main.cc:59 NOTICE[0]: 

在这里插入图片描述在这里插入图片描述我们看到,这些信息,都能对应上,
而且只打印了前半部分。
这是后面我们要分析的,
timeString , nanos, filename , metadata->lineNumber , logLevel , runtimeId
这些record头部的信息,值从何得来。
目前我们看到几个问题:
1。 信息只有前半部分,时间
2。文件名中的路径被删除了。只留下main.c。这是前述“压缩”的重要组成部分之一。
3。 runtimeId,这个可能就是线程号。但是要注意的是nanolog的线程id,并不是线程ID。是nanolog自己维护的一个entry id。每开一个线程,就多一个。

metadata

然后我们看到了metadata

        // Print out the actual log message, piece by piece
        PrintFragment *pf = reinterpret_cast<PrintFragment*>(
                reinterpret_cast<char*>(metadata)
                + sizeof(FormatMetadata)
                + metadata->filenameLength);

其实前面,我们已经看到过:
在这里插入图片描述也就是意味着,我们在这里分析时,meta信息,已加载了。
没有关系,一会我们再分析一遍。
metadata->filenameLength=8
正好是main.cc加一个’\0’。

查看业务面的log语句

    NANO_LOG(NOTICE, "A string, pointer, number, and float: '%s', %p, %d, %f",
                        randomString,
                        &randomString,
                        512,
                        3.14159);

可以看到,共4个参数。
其中3个数字,1个字符串。
后面的代码:
metadata->numPrintFragments=4 //argc: 4 parameters

然后,在printSingleArg
在这里插入图片描述执行这之后:

2024-12-10 16:23:46.000853307 main.cc:59 NOTICE[0]: A string, pointer, number, and float: 'Hello World

即已打印出第一个参数。
向前步进:
在这里插入图片描述

第二个参数%p在这里插入图片描述
以此类推,直到最后一个参数完成。
团成员到主循环,准备解压下一条
在这里插入图片描述## 然后,发现这里前面我的一个误解
2024-12-10 16:23:46.000856704 main.cc:88 NOTICE[0]: Simple log message with 0 parameters
是真的有这个数据。
否则不会指出是哪个文件的哪一行,这里是我疏忽了。
也给了我们进一步简化这个程序的可能性。
在这里插入图片描述

注释掉 runBenchmark();

注掉main()中的runBenchmark();,之后,程序的运行轨迹简化了许多。
不过,要注意的是,logFile需要删除重做。如果不删除,文件会被重新打开,从头开始重写。旧的内容还在。
在这里插入图片描述

改过之后,2条记录之后,这里就直接返回了

在这里插入图片描述

小结

基本准备好一套,可以进一步分析代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flask使用长连接(Connection会失效)、http的keep-alive、webSocket。---GPU的CUDA会内存不足报错

Flask Curl命令返回状态Connection: close转keep-alive的方法 使用waitress-serve启动 waitress-serve --listen0.0.0.0:6002 manage:app 使用Gunicorn命令启动 gunicorn -t 1000 -w 2 -b 0.0.0.0:6002 --worker-class gevent --limit-request-line 8190 manage:appFlask使用f…

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异&#xff0c;他是需要先对接的到代理服务器&#xff0c;通过代理服务器进行对接&#xff0c;所以只要保证U8能上网就能对接&#xff0c;和畅捷通T的模式有点类似 流程&#xff1a; 注册成为开发者&#xff08;用于创建用友U8 API应…

xtu oj 1618 素数个数

文章目录 前言代码思路 前言 有点儿难&#xff0c;至少对我来说。去年考试我没写出来。 代码 #include<stdio.h> #include<stdbool.h> #include<stdlib.h>//加 math 那个头文件好像要加这个头文件&#xff0c;我之前编译错误过&#xff0c;血泪教训 #incl…

DAY3 构造函数

构造函数使用代码&#xff1a; #include <iostream> using namespace std; class Rec {const int length;int width; public:Rec():length(10){cout << "Rec无参构造函数" << endl;};Rec(int a,int b):length(a),width(b){cout << "Re…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…

LLama系列模型简要概述

LLama-1&#xff08;7B, 13B, 33B, 65B参数量&#xff1b;1.4T tokens训练数据量&#xff09; 要做真正Open的AI Efficient&#xff1a;同等预算下&#xff0c;增大训练数据&#xff0c;比增大模型参数量&#xff0c;效果要更好 训练数据&#xff1a; 书、Wiki这种量少、质量高…

22. Three.js案例-创建旋转的圆环面

22. Three.js案例-创建旋转的圆环面 实现效果 知识点 WebGLRenderer (WebGL渲染器) THREE.WebGLRenderer 是Three.js中最常用的渲染器&#xff0c;用于将场景渲染到WebGL画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

Burp(5)web网页端抓包与app渗透测试

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类&#xff0c;包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数&#xff1a;接受的参数是data_path&#xff08; 存放数据集的目录…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要&#xff1a;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日&#xff0c;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

java类静态初始化死锁问题

问题 前端时间帮同事分析了一个IO线程阻塞问题&#xff0c;该问题导致服务端无法处理任何请求&#xff0c;只能进行重启解决&#xff1b;事发时运维dump了下栈信息&#xff0c;堆栈信息如下图&#xff1a; 从上面可以看到io线程都阻塞于Object.wait()&#xff0c;具体是执行Cl…

厦门凯酷全科技有限公司怎么样?

随着短视频和直播带货的兴起&#xff0c;抖音电商平台迅速崛起&#xff0c;成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中&#xff0c;如何抓住机遇、实现销售增长&#xff0c;成为了每个企业面临的挑战。厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

在Windows和Ubuntu上安装SDKMAN

文章目录 1. SDKMAN概述2. 安装与使用SDKMAN2.1 在Windows上安装SDKMAN2.1.1 安装Git for Windows2.1.2 安装SDKMAN 2.2 利用SDKMAN管理Java2.2.1 查看所有可用的OpenJDK发行版2.2.2 安装Java2.2.3 查看Java版本2.2.4 shell指定使用某个Java版本 2.3 在Ubuntu上安装SDKMAN2.3.1…

1210 作业

思维导图 作业 使用read和write函数拷贝文件&#xff0c;一半拷进一个文件&#xff0c;另一半拷进另一个文件 #include <myhead.h> int main(int argc, const char *argv[]) {int fd1 open("./z1.txt",O_RDONLY);if(fd1-1){perror("open");return…