golang应用修改进程运行时间方案

本文探讨了两种修改Golang应用运行时间的方法:外部实现如libfaketime,但可能遇到问题;二是通过源码改造,尤其是关注runtime.now()和runtime.nanotime(),并介绍如何在编译期利用ldflags注入时间偏移来实现自定义的时间获取功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 外部实现
  • ** libfaketime: 此路不通**! 详情见 https://www.coder.work/article/199982
  • 机器时间(当然可以) 但是可能会遇到其他关联的基础设施阻力,比如sym3上的docker改时间只能改宿主机时间,并且也会有其他问题。
2. golang源码改造(基于1.14)
  1. 通过分析time和runtime/time.go 得知,目前最核心获取时间的是两个函数,分别是runtime.now()和runtime.nanotime。其中time.now的实现直接在runtime库的汇编里,通过runtime·time符号来连接,nanotime是在runtime/time_nofake.go对汇编实现的nanotime1()进行了简单封装。
nanotime:获取的是系统单调增长的时间,不随操作系统时间设置变化而减少。在golang大面积应用于协程调度,timer相关的实现里(参考runtine/proc.go:checkTimers)。也正是因为这个,只改now会有诡异的现象发生,
nanotime的实现:

runtime/time_nofake.go

//go:nosplit
func nanotime() int64 {
	return nanotime1()
}

now: 获取操作系统的时间,可被回溯到旧时间
now的实现:

以runtime/sys_windows_amd64.s为例:

TEXT time·now(SB),NOSPLIT,$0-24
	CMPB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值