自学内容网 自学内容网

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

当前的目标

没有办法,还要继续。
当前的目标,是找到解压时, 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条记录之后,这里就直接返回了

在这里插入图片描述

小结

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


原文地址:https://blog.csdn.net/haoyujie/article/details/144377223

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!