NanoLog起步筆記-6-StaticLogInfo

nonolog起步筆記-6-StaticLogInfo

  • StaticLogInfo
  • 文件名和行號
    • 文件名和行號的傳入
    • log參數
  • RuntimeLogger::registerInvocationSite
    • logid為什么只能被賦一次值
  • reserveAlloc
  • 加入消息頭
  • finishAlloc
  • 返回

StaticLogInfo

寫C語言編譯前端時,給我印象深刻的一部分是,我們需要記錄,當前的位置,以便于在出錯時,報告出錯的位置。
NanoLogInternal::log函數中,注冊的部分,一部分功能,也是這樣的。
這個方面,還是我比較看重的,前面我提到,現在存在的一個bug與之相關,如果在解壓某條出錯時,打印文件名和行號,這問題,也就不是一個問題了。

文件名和行號

文件名和行號的傳入

如下:

#define NANO_LOG(severity, format, ...) do { \...\NanoLogInternal::log(logId, __FILE__, __LINE__, NanoLog::severity, format, \numNibbles, paramTypes, ##__VA_ARGS__); \
} while(0)

log參數

template<long unsigned int N, int M, typename... Ts>
inline void
log(int &logId,const char *filename,const int linenum,
...

在這里插入圖片描述## 調試時的效果
選擇一個用戶面請求
在這里插入圖片描述
代碼是這樣:

    // All the standard printf specifiers (except %n) can be usedchar randomString[] = "Hello World";NANO_LOG(NOTICE, "A string, pointer, number, and float: '%s', %p, %d, %f",randomString,&randomString,512,3.14159);

在這里插入圖片描述
如上圖,能夠看到文件名與行號,與調用方對應。
這時logI=-1,還沒有被賦值。

RuntimeLogger::registerInvocationSite

##logid賦值和入隊

            logId = static_cast<int32_t>(invocationSites.size());invocationSites.push_back(info);

在這里插入圖片描述

        // Maps unique identifiers to log invocation sites encountered thus far// by the non-preprocessor version of NanoLogstd::vector<StaticLogInfo> invocationSites;

logid為什么只能被賦一次值

    if (logId == UNASSIGNED_LOGID) {const ParamType *array = paramTypes.data();StaticLogInfo info(&compress<Ts...>,filename,linenum,severity,format,sizeof...(Ts),numNibbles,array);RuntimeLogger::registerInvocationSite(info, logId);}

如上,這代表著,在同一處代碼中的logID不會被重新賦值。

reserveAlloc

這里暫略,如下圖,因為分配的大小很小,所以,直接返回了。
沒有鎖。
這是因為每塊內存,都是線程專有的。不需要鎖。
在這里插入圖片描述

加入消息頭

如下圖,消息頭(似乎尾),描述了logid,根據這個id,也就能對應上這段binary內存的meta定義了(前面registerInvocationSite,注冊的)。
在這里插入圖片描述

finishAlloc

刷新內存,收尾。確保cache內容刷入內存。
NanoLogInternal::RuntimeLogger::finishAlloc(allocSize);

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

返回

在這里插入圖片描述# 這兩個沒有命中bread point,是因為級別過低
這里不要吃驚,只是簡單地因為:
NanoLog::setLogLevel(NOTICE);
而這里是DEBUG.
在這里插入圖片描述

namespace LogLevels {/*** The levels of verbosity for messages logged with #NANO_LOG.*/enum LogLevel {// Keep this in sync with logLevelNames defined inside Log.cc.SILENT_LOG_LEVEL = 0,/*** Bad stuff that shouldn't happen. The system broke its contract to* users in some way or some major assumption was violated.*/ERROR,/*** Messages at the WARNING level indicate that, although something went* wrong or something unexpected happened, it was transient and* recoverable.*/WARNING,/*** Somewhere in between WARNING and DEBUG...*/NOTICE,/*** Messages at the DEBUG level don't necessarily indicate that anything* went wrong, but they could be useful in diagnosing problems.*/DEBUG,NUM_LOG_LEVELS // must be the last element in the enum};
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件工程 概述

軟件 不僅僅是一個程序代碼。程序是一個可執行的代碼&#xff0c;它提供了一些計算的目的。 軟件被認為是集合可執行的程序代碼&#xff0c;相關庫和文檔的軟件。當滿足一個特定的要求&#xff0c;就被稱為軟件產品。 工程 是所有有關開發的產品&#xff0c;使用良好定義的&…

Sui 集成 Phantom,生態迎來全新里程碑

作為領先的非托管多鏈加密&#x1f45b;&#xff0c;Phantom 宣布將支持 Sui 區塊鏈。Sui 將加入 Solana、Bitcoin 和 Ethereum 隊伍&#xff0c;成為該 wallet 支持的少數 L1 區塊鏈之一。 此次集成也大幅提升了 Phantom 的互操作性&#xff0c;同時表明 wallet 提供商和應用…

目標跟蹤領域經典論文解析

親愛的小伙伴們&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你對深度學習的奧秘、JAVA 、PYTHON與SAP 的奇妙世界&#xff0c;亦或是讀研論文的撰寫攻略有所探尋&#x1f9d0;&#xff0c;那不妨給我一個小小的關注吧&#x1f970;。我會精心籌備&#xff0c;在…

如何解決 java.nio.charset.CoderMalfunctionError: 編碼器故障錯誤問題?親測有效的解決方法!

java.nio.charset.CoderMalfunctionError 是一個在 Java 中相對較少遇到的異常&#xff0c;通常與字符編碼轉換過程中的錯誤有關。當 Java 程序在進行字符編碼轉換時&#xff0c;遇到無法處理的字符或編碼故障時&#xff0c;就會拋出該異常。 1. 問題描述 java.nio.charset.C…

低級爬蟲實現-記錄HCIP云架構考試

因工作需要考HCIP云架構&#xff08;HCIP-Cloud Service Solution Architect&#xff09;證書, 特意在淘寶上買了題庫&#xff0c; 考過了。 事后得知自己被坑了&#xff0c; 多花了幾十大洋。 所以想著在授權期內將題庫“爬”下來&#xff0c; 共享給大家。 因為整個過程蠻有…

QGroundControl之5-AppSettings.cc

介紹 應用程序設置 Application Settings &#xff0c;這里看下語言選擇功能&#xff0c;它是怎么和json文件關聯起來的&#xff0c;剛剛看的時候&#xff0c;很是奇怪這么多的json文件作用。 1.AppSettings.cc 文件怎么和App.SettingsGroup.json關聯 在AppSettings.cc文件沒…

jenkins郵件的配置詳解

Jenkins郵件的配置涉及多個步驟和細節,以下是詳細的配置指南: 一、前期準備 確定郵件服務:明確Jenkins將要使用的郵件服務,如QQ郵箱、163郵箱、公司郵箱(基于Microsoft 365或Exchange Server)等。獲取SMTP配置信息:根據郵件服務類型,獲取相應的SMTP服務器地址、端口號…

【ArcGIS微課1000例】0134:ArcGIS Earth實現二維建筑物的三維完美顯示

文章目錄 一、加載數據二、三維顯示三、三維符號化一、加載數據 加載配套實驗數據(0134.rar中的建筑物,2d或3d都可以),方法如下:點擊添加按鈕。 點擊【Add Files】,在彈出的Open對話框中,選擇建筑物,點擊確定,完成添加。 默認二維顯示: 二、三維顯示 右鍵建筑物圖層…

jupyterlab 增加多個kernel,正確做法

1、背景 需要增加一個kernel然后相當于隔離一個環境 juypterlab Version 3.0.14 2、用conda 安裝 例如&#xff0c;你在conda下有一個python 3.12 的環境 py312 ipython kernel install --user --namepy312 如果保持的話&#xff0c;用pip安裝相應的包就好 3、檢查是否配置好 …

案例-商品列表(組件封裝)

標簽組件封裝 1.雙擊顯示&#xff0c;自動聚焦 2.失去焦點&#xff0c;隱藏輸入框 標簽一列&#xff0c;不同行的標簽內容不同&#xff0c;但是除此之外其他基本一致&#xff0c;所以選擇用 標簽組件 將這一部分封裝為一個組件&#xff0c;需要時組件標簽展示。 首先標簽處一進…

Python 基礎學習(一)

一.基礎語法 注釋 Python中單行注釋以 # 開頭&#xff0c;如下&#xff1a; #!/usr/bin/python3# 第一個注釋 print ("Hello, Python!") # 第二個注釋多行注釋可以用多個 # 號&#xff0c;還有 ‘’’ 和 “”"&#xff1a; #!/usr/bin/python3# 第一個注釋…

TIM輸入捕獲---STM

一、簡介 IC輸入捕獲 輸入捕獲模式下&#xff0c;當通道輸入引腳出現指定電平跳變時&#xff0c;當前CNT的值將被鎖存在CCR中&#xff0c;可用于測量PWM波形的頻率、占空比、脈沖間隔、電平持續時間等參數 每個高級定時器和通用定時器都擁有4個輸入捕獲通道 可配置為PWMI模…

【Android Studio】學習——網絡連接

實驗&#xff1a;Android網絡連接 文章目錄 實驗&#xff1a;Android網絡連接[toc]實驗目標和實驗內容&#xff1a;1、掌握Android聯網的基本概念&#xff1b;2、能夠使用URL connection實現網絡連接&#xff1b;3、掌握第三方庫的基本概念4、需實現的具體功能 實驗結果功能說明…

ROS學習筆記二:ROS環境搭建

安裝ubuntu安裝ROS 參考趙虛左老師教程&#xff1a;ROS安裝ROS 快速上手體驗 -使用命令來實現 –創建工作空間&#xff1a; mkdir -p ros_learn_ws/src// ros_learn_ws為自定義空間 cd ros_learn_ws catkin_make –創建ROS功能包并添加依賴 cd src catkin_create_pkg demo_01 r…

5G中什么是ATG網絡?

有人問Air to Ground Networks for NR是怎么回事&#xff1f;這個是R18 NR才引入的。 ATG很多部分和NTN類似中的內容類似。比較明顯不同的是&#xff0c;NTN的RF內容有TS 38.101-5單獨去講&#xff0c;而ATG則會和地面網絡共用某些band&#xff0c;ATG可以工作在N1/N3/N34/N39…

基礎算法--雙指針

兩數之和 點擊&#xff1a;題目鏈接 解法一&#xff1a;暴力解法 時間復雜度&#xff1a;O(N^2) 算法思路&#xff1a;兩層for循環即可列出所有兩個數字的組合&#xff0c;判斷是否等于目標值 算法流程&#xff1a; 兩層 for 循環&#xff1a; 外層 for 循環依次枚舉第?個…

什么是Linux系統架構?

? Linux系統架構是指Linux操作系統的整體結構和工作層次&#xff0c;它定義了系統組件如何交互、如何管理硬件資源&#xff0c;以及用戶如何通過不同的層次與系統進行交互。Linux架構通常有兩種劃分方法&#xff1a;系統層次架構和功能層次架構&#xff0c;兩者都可以很好地描…

spring6:4、原理-手寫IoC

目錄 4、原理-手寫IoC4.1、回顧Java反射4.2、實現Spring的IoC 4、原理-手寫IoC 我們都知道&#xff0c;Spring框架的IOC是基于Java反射機制實現的&#xff0c;下面我們先回顧一下java反射。 4.1、回顧Java反射 Java反射機制是在運行狀態中&#xff0c;對于任意一個類&#x…

不是“我應該做什么”,而是“我想做什么”

1. 識別內心的渴望 首先&#xff0c;我們需要識別自己真正的愿望和激情所在。這可能需要一些時間和自我反思。問自己&#xff1a;在沒有任何外界壓力的情況下&#xff0c;我真正想做的是什么&#xff1f;是賺錢、生活、旅行、追星&#xff0c;還是其他什么&#xff1f;識別這些…

30天學會Go--第7天 GO語言 Redis 學習與實踐

30天學會Go–第7天 GO語言 Redis 學習與實踐 文章目錄 30天學會Go--第7天 GO語言 Redis 學習與實踐前言一、Redis 基礎知識1.1 Redis 的核心特性1.2 Redis 常見使用場景 二、安裝 Redis2.1 在 Linux 上安裝2.2 在 Windows 上安裝2.3 使用 Docker 安裝 Redis 三、Redis 常用命令…