从boost库到时间戳

news2025/7/15 3:57:37

一、以问题引入
授权证书一般有到期时间的说法,公司测试同事在测试更新后的证书时,将系统时间调到了2050年,重启服务后发现各个进程的cpu占用率特别高;结合日志分析,发现这些进程 都在不停的刷heartbeat()的日志,也就是在频繁的进行心跳。

信息1:查看代码可知心跳间隔在配置文件中设置的是30秒
信息2:公司使用的mysql服务业在频繁重启,查看日志发现 This MySQL server doesn’t support dates later then 2038
信息3: 将系统时间调到2037年,发现mysql无问题,进程cpu占用率也下来了。

二、确定问题点或问题方向

#include <boost/date_time.hpp>						//boost的date_time模块的头文件
#include <boost/thread.hpp>
#include <iostream>

int main(){
    while(1){
        auto sec = boost::posix_time::seconds(30); //心跳间隔30秒
        boost::this_thread::sleep(sec);
        std::cout<<"=== "<<sec<<std::endl;	       //使用cout代替心跳通信逻辑
    }
    return 0;
}

简化heartbeat()函数逻辑,分别在2037 2038 2050年测试,发现代码内采用的boost库计时功能在2038 2050年不准确(终端频繁打印输出)。
加上其他同事提示int32位存储时间戳会存在溢出的情况,就逐步确定问题是2038年时间戳的方向了

其他辅助:
相同测试代码在 boost-1.58 boost-1.71环境下对比,高版本始终无问题,低版本在2038年有问题,所以细分方向是boost-1.58版本的date_time模块在时间戳方便存在缺陷

三、boost低版本date_time模块在时间戳方面缺陷的解决方法
修改boost/date_time/time_resolution_traits.hpp 文件中 类模板time_resolution_traits的默认模板参数类型
typename var_type = boost::int32_t 替换为 boost::int64_t即可

对比boost-1.71版本内的该文件,可知1.67版本开始,官方已经开始采用int64_t类型来存储时间戳了

四、gdb定位流程(可选择性阅读)
图1
图1
图 2
在这里插入图片描述
图3
在这里插入图片描述

图4
在这里插入图片描述

图5
在这里插入图片描述

图6
在这里插入图片描述

图7
在这里插入图片描述

图8
在这里插入图片描述

图9
在这里插入图片描述

图10
在这里插入图片描述

图11
在这里插入图片描述
注:实际调试过程可能并没有这么精简

  • boost::this_thread 这个命名空间在哪个头文件定义的?
  • boost::this_thread::sleep()对应的头文件我找到了,但是函数重载了,会走到哪个函数呢?应该给哪个加断点呢?

五、复测
尝试将上述图11定位到的代码修改为int64_t, 再次测试,可以发现在2038年 2050年不会再存在问题

六、2038年时间戳的大致梳理

  1. int32_t 本质是 int 类型,即32位有符号整数,取值范围 − 2 31 -2^{31} 231 2 31 − 1 2^{31}-1 2311,即 − 2147483648 -2147483648 2147483648 2147483647 2147483647 2147483647
  2. 使用python脚本输出 2038年1月19日03:14:07 UTC 对应的时间戳,结果是 2147483647
from datetime import datetime, timezone  
import time  
  
# 设置目标日期和时间(UTC)  
target_date_time = datetime(2038, 1, 19, 3, 14, 7, tzinfo=timezone.utc)  
  
# 将datetime对象转换为时间戳(秒)  
timestamp = int(target_date_time.timestamp())  
  
# 打印时间戳  
print(timestamp) 

  1. 使用gdb对时间戳进行尝试
(gdb) set $aa=2147483647    # 赋值32位有符号整型数的最大值给aa,对应的是 2038年1月19日03:14:07 UTC
(gdb) ptype $aa             # 打印aa的类型,结果是int
type = int
(gdb) p $aa                 # 打印aa的值
$8 = 2147483647
(gdb) set $aa=$aa+1         # aa+1,对应的是 2038年1月19日03:14:08 UTC
(gdb) ptype $aa             # 可以看到aa的类型不变
type = int
(gdb) p $aa                 # 超出了int类型的最大值,溢出了,直接变为int类型的最小值
$9 = -2147483648
(gdb)

  1. 如果时间戳采用64位整型数表示,情况会怎么样?
    先明确64位有符号整型数的取值范围 − 2 63 -2^{63} 263 2 63 − 1 2^{63}-1 2631,即 9223372036854775808 9223372036854775808 9223372036854775808 9223372036854775807 9223372036854775807 9223372036854775807
(gdb) set $bb=9223372036854775807    # 赋值64位有符号整型数的最大值给bb
(gdb) ptype $bb                      # 打印bb的类型,输出是long long
type = long long
(gdb) p $bb
$10 = 9223372036854775807
(gdb) p $bb/(12*30*24*60*60)         # 使用64位可以表示2965亿年的时间戳
$11 = 296533308798
(gdb)

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

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

相关文章

正版 navicat 下载

1. 打开浏览器访问 navicat 官网 Navicat | 下载 Navicat Premium 14 天免费 Windows、macOS 和 Linux 的试用版 windows 用户选择这三项其中一个就可以 2. 下载 点击之后等个几秒钟就会开始下载了 3. 双击打开 下载好的 .exe 程序 进入安装程序 (不影响之前已经安装过的) 可…

12.2 Go 编写测试代码

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

web3技术的特点

Web1、Web2和Web3是互联网发展的三個阶段&#xff0c;它们在架构、数据所有权、应用模式等方面都有着本质的区别。需要注意的是&#xff0c;Web3 仍处于早期发展阶段&#xff0c;其技术和应用场景还在不断探索和完善。Web3 的最终形态和影响还有待观察。北京木奇移动技术有限公…

排序1---插入排序

目录 插入排序的基本思路&#xff1a; 插入排序的代码实现&#xff1a; 代码&#xff1a; 代码解读&#xff1a; 插入排序的时间、空间复杂度&#xff1a; 插入排序的基本思路&#xff1a; 插入排序是一个比较简单的排序。 我们插入排序就是我们先假设前面的一段区间有序…

【每天学会一个渗透测试工具】AWVS安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨AWVS介绍 是应用漏洞扫描工具 &#x1f4a6;使用docker安装 docker pull dockermi3aka/awvs启动镜像 docker run -dit …

期货分仓软件的搭建流程

期货分仓软件的搭建流程&#xff0c;是一个涉及多个环节的复杂过程。首先&#xff0c;明确功能需求是至关重要的&#xff0c;这有助于更好地规划软件的开发和设计。接下来&#xff0c;技术选型是关键一步&#xff0c;需要根据开发经验和项目需求&#xff0c;选择适合的编程语言…

webpack处理样式资源04--webpack入门学习

处理样式资源 本章节学习使用 Webpack 如何处理 Css、Less、Sass、Scss、Styl 样式资源 介绍 Webpack 本身是不能识别样式资源的&#xff0c;所以我们需要借助 Loader 来帮助 Webpack 解析样式资源 我们找 Loader 都应该去官方文档中找到对应的 Loader&#xff0c;然后使用…

C# WPF入门学习主线篇(二十二)—— 样式(Styles)的定义和应用

C# WPF入门学习主线篇&#xff08;二十二&#xff09;—— 样式&#xff08;Styles&#xff09;的定义和应用 欢迎来到C# WPF入门学习系列的第二十二篇。本篇文章将详细介绍WPF中的样式&#xff08;Styles&#xff09;的定义和应用。样式在WPF中起到重要作用&#xff0c;通过样…

Hallo技术:革新电影、游戏与虚拟现实中的动态肖像动画

在数字娱乐的浪潮中&#xff0c;逼真的动态肖像动画成为了电影制作、游戏开发和虚拟现实等领域不可或缺的一部分。复旦大学研发的Hallo技术&#xff0c;以其独特的扩散模型和分层音频驱动视觉合成模块&#xff0c;为这一领域带来了革命性的突破。 技术概览 Hallo技术是一种基…

Nvidia芯片Jetson系列 系统烧录环境 搭建

一、序言 Jetson 系列产品烧录系统的方法一般有两种&#xff1a; 一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统&#xff08;请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》&#xff09;。 另一种即为当前文档所描述的&#xff0c;在安装 Ub…

LVS+Keepalived高可用集群部署

一、高可用群集(HA)的作用 企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险&#xff0c;单点故障一旦发生&#xff0c;企业服务将发生中断&#xff0c;造成极大的危害。 高可用集群是由一台主调度器和一台或多台备用调度器。在主调度器能够正常运转时&#xff0c;…

JVM 相关知识整理

文章目录 前言JVM 相关知识整理1. 新生代和老年代2. 对象的分配过程3. Full GC /Major GC 触发条件4. 逃逸分析4.1.示例4.2. 使用逃逸分析&#xff0c;编译器可以对代码做如下优化 5. 对象的内存分配6. Minor GC 与 Major GC/Full GC的比较:7. 什么对象进入老年代7.1. 大对象直…

【Tello无人机】使用Matlab完成控制器的设计—建模

模型辨识篇 在实际的无人机系统中&#xff0c;控制器的设计至关重要&#xff0c;它直接影响无人机的稳定性和响应能力。然而&#xff0c;要设计出高效、可靠的控制器&#xff0c;首先必须准确理解无人机的动态行为&#xff0c;这就需要通过收集输入输出数据来辨识其运动学模型。…

LabVIEW与Matlab联合编程的途径及比较

​ LabVIEW和Matlab联合编程可以通过多种途径实现&#xff0c;包括调用Matlab脚本节点、使用LabVIEW MathScript RT模块、利用ActiveX和COM接口&#xff0c;以及通过文件读写实现数据交换。每种方法都有其独特的优势和适用场景。本文将详细比较这些方法&#xff0c;帮助开发者…

【Kubernetes】集群学习

常见的 Kubernetes 集群类型 Kubernetes 集群可以根据不同的标准进行分类&#xff0c;但通常我们根据其部署环境和用途来区分集群类型。以下是几种常见的 Kubernetes 集群类型&#xff1a; 开发集群&#xff08;Development Cluster&#xff09;&#xff1a; 用于开发和测试环…

RAG优化技巧|7大挑战与解決方式|提高你的LLM能力

在当今快速发展的人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经成为无处不在的技术&#xff0c;它们不仅改变了我们与机器交流的方式&#xff0c;还在各行各业中发挥着革命性的影响。 然而&#xff0c;尽管LLM RAG的能力已经让人惊叹&#xff0c;但我…

分享一下,如何搭建个人网站的步骤

在这段充满探索与创造的奇妙旅途中&#xff0c;我就像一位耐心的建筑师&#xff0c;在数字世界的荒原上精心雕琢&#xff0c;两周的时光缓缓流淌。每天&#xff0c;我与代码共舞&#xff0c;手执HTML、CSS与JavaScript这三大构建魔杖&#xff0c;一砖一瓦地筑起了梦想中的网络城…

string类(C++)

文章目录 一.引言二.string类&#xff1a;成员函数&#xff1a;构造函数&#xff1a;析构函数 遍历&#xff1a;operator[]迭代器&#xff08;iterator&#xff09;范围for反向遍历(反向迭代器reverse_iterator)const迭代器 容器&#xff1a;capacity扩容clear清数据shrink_to_…

Azure数据分析Power BI

Azure数据分析Power BI 一、Power BI简介二、Power BI 如何匹配角色三、Power BI 构建基块四、使用 Power BI 服务一、Power BI简介 Microsoft Power BI 是一系列的软件服务、应用和连接器,这些软件服务、应用和连接器协同工作,将不相关的数据源转化为合乎逻辑、视觉上逼真的…

Web渗透:XSS-反射型存储型

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者将恶意脚本注入到网页中&#xff0c;其他用户在浏览这些页面时&#xff0c;可能会执行这些恶意脚本&#xff0c;从而导致各种安全问题&#xff0c;如…