当前位置: 首页 > news >正文

从boost库到时间戳

一、以问题引入
授权证书一般有到期时间的说法,公司测试同事在测试更新后的证书时,将系统时间调到了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)

相关文章:

  • HTML5 WebSocket:实时通信的新篇章
  • 群晖虚拟化创建存储池失败问题解决
  • IIS配置網站登錄驗證,禁止匿名登陸
  • Django中间件探索:揭秘中间件在Web应用中的守护角色与实战应用
  • ConcurrentHashMap详解
  • LabVIEW故障预测
  • (7)摄像机和云台
  • Ubuntu20.04 使用scrapy-splash爬取动态网页
  • 电脑ffmpeg.dll丢失原因解析,找不到ffmpeg.dll的5种解决方法
  • python实战:将视频内容上传到社交媒体平台
  • python爬虫之aiohttp多任务异步爬虫
  • DeepSORT(目标跟踪算法) 卡尔曼滤波的完整流程
  • 【Android】怎么使APP进行开机启动
  • Web前端项目-交互式3D魔方【附源码】
  • yolo-inference多后端+多任务+多算法+多精度模型 框架开发记录(cpp版)
  • .pyc 想到的一些问题
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 0基础学习移动端适配
  • android 一些 utils
  • Apache Spark Streaming 使用实例
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • spring + angular 实现导出excel
  • Vue UI框架库开发介绍
  • Vultr 教程目录
  • 关于 Cirru Editor 存储格式
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 两列自适应布局方案整理
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (2.2w字)前端单元测试之Jest详解篇
  • (Matlab)使用竞争神经网络实现数据聚类
  • (PySpark)RDD实验实战——取一个数组的中间值
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (接口自动化)Python3操作MySQL数据库
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (贪心) LeetCode 45. 跳跃游戏 II
  • .CSS-hover 的解释
  • .Net Core中Quartz的使用方法
  • .Net MVC4 上传大文件,并保存表单
  • .NET 中 GetProcess 相关方法的性能
  • .Net插件开发开源框架
  • .net程序集学习心得
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • @DataRedisTest测试redis从未如此丝滑
  • [ C++ ] 类和对象( 下 )
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ACTF2020 新生赛]Include