Chrono Mock
语言简体中文

常见问题

简短的回答,包括那些关于这个工具不会做什么的问题。

它会改动我电脑的时钟吗?

不会,以后也不会——这正是这个工具的全部意义所在。被改动的时间只对一个进程及其启动的子进程可见。你的域登录、证书、Windows 更新和其他所有应用,全程看到的都是真实日期。

需要管理员权限吗?

运行它不需要。zip 包无需安装程序,不会向注册表写入任何内容,可以放在 U 盘上的文件夹里直接运行。可选的 .msi 只在安装时需要一次管理员权限,因为它会为这台计算机上的每个账户安装。

它能用在我的应用上吗?

老实说,这类工具没有哪一个能事先保证——所以这个工具选择去测量它。每次会话都以一个判定(生效、部分生效、未生效)结束,同时给出应用实际读取过的时间通道清单及各自的调用次数,以及未被覆盖的通道清单。

应用可能通过一条没有被任何东西拦截的途径读取时钟——来自服务器、来自数据库、来自某个运行时层。出现这种情况时,你会收到通知,而不是被留在“测试通过了”的假定里。

它能用于 .NET、Java 和 Python 应用吗?

部分可以,而且差别很重要。这三者都标记为实验性:它们在测试目标上可以工作,尚未经过广泛测试,而内置的审计才是你的事实依据,而不是这一段文字。

  • .NET——挂钟时间和会话时区已覆盖。Stopwatch 仍然使用真实的高分辨率计数器,除非你选择启用缩放。
  • Java——挂钟时间、经过的时间和会话时区已覆盖。时区以固定偏移量的形式到达,命名形如 GMT+05:30。
  • Python——time.time 和 datetime 已覆盖。perf_counter,以及 Python 3.13 及更高版本中的 monotonic,使用的是高分辨率计数器,除非你选择启用。

它能用于 Electron 和 Chromium 应用吗?

可以,通过另一种机制。它们的时钟位于注入够不到的沙盒渲染进程中,所以应用会带着一个调试端口和一个干净的一次性配置文件启动,它自己的 JavaScript 时间 API 被放到会话时钟上——包括 Web Worker 内部,计时器往往实际就在那里。

有一个限制值得了解:Electron 应用的主进程在 Node 中运行,会话无法触及,所以它保持真实时钟,报告也会这样说明。页面及其 worker 读取的是会话时区。

Chromium 与 Electron 模式是如何工作的——它能到达什么、到达不了什么,以及为什么调试端口是需要留意的部分。

能让时间比真实时间走得更快吗?

可以。选择一个整数倍率,应用的时钟就会按这个速度运行——x1440 让一天只需一分钟,于是 30 天的试用期大约半小时就会到期。你也可以冻结时钟,或在会话中途向前、向后跳转。

倒计时和定时器位于另一条轴上,加速它们需要另一个开关,因为缩放它们会改变很多应用所依赖的行为。

能只改时区、不改日期吗?

可以。会话带有自己的固定偏移量,只对该进程可见,系统时区则原封不动。这是大多数工具跳过的部分,也是你复现“只在五个时区之外的客户那里才会出现”的缺陷的办法。

夏令时怎么办?

会话时区是没有夏令时的固定偏移量。设为波兰的会话,无论它的时钟读到的是三月还是七月,都停留在你选定的偏移量上,所以跨越真实切换的运行,会与该时区实际显示的时间相差一小时。

因此,让应用经历夏令时切换,目前还不是这个工具能做的事,日期计算器会如实说明这一点,而不是猜测。

为什么我的杀毒软件会报警?

因为向另一个进程注入库,是一种合法的、有文档记载的 Windows 技术,恶意软件也在使用它。这是由该技术触发的误报,而不是由工具对你的机器所做的任何事触发的。被注入的库是 chrono_hook.dll,由公开的源代码在 GPL-3.0 下构建,你可以自己重新构建。Chromium 和 Electron 模式完全不注入。

下载页面说明了该怎么处理。

这是延长试用期或绕过许可证的办法吗?

不是,它也不是为此而做的。Chrono Mock 是用来测试你自己负责的软件的——你自己的许可证到期、你自己的续费逻辑、你自己的月末报表。这里没有任何示例、预设或页面会演示如何延长别人的试用期。

带有许可证保护的软件,恰恰是最有可能让这个工具失效的情形:防篡改代码经常通过刻意选择的、难以拦截的途径读取时间,而时钟向后拨动正是这类软件被编写来检测的情况。一个方向相反的功能正在规划中——一种针对你自己的应用运行一系列时间操作,并报告你的保护措施拦住了其中哪些的模式。

能在持续集成中使用吗?

可以。命令行版是一个单独的下载,大约 2.4 MB,无需安装运行时。每个命令都支持 --json,并以流水线可以据以分支的退出码结束,会话还可以把它的证据写入文件。

它和 RunAsDate 有什么不同?

RunAsDate 拦截五个墙上时钟函数,而且做得很好。本工具监视 44 个时间通道,并把其中 30 个换到会话时钟上,可以加快时钟,给进程独立的时区,跟随子进程,并在事后告诉你哪些通道真正被覆盖了。它还是开源的,而 RunAsDate 是闭源免费软件。反过来,RunAsDate 可以附加到已在运行的应用程序,本工具做不到。

完整对比还会说明 RunAsDate 在哪些情况下是更好的选择。

这是 Windows 版的 libfaketime 吗?

从精神上说,是的——同样是只为一个程序而不是为整台机器拨动时间的想法。实际上它是另一种实现,因为 libfaketime 依赖 LD_PRELOAD,而 Windows 上并不存在它。有专门讲这件事的一页。

它免费吗?会往任何地方发送东西吗?

免费,并在 GPL-3.0 下开源。无需账号,无遥测,它根本不连接互联网——拔掉网线,整个工具照样能用。

窗口里确实有两个通向外部的控件,所以值得点明,而不是让你自己去发现:标题栏中的 Donate 按钮和 GitHub 按钮。按下其中任何一个都会把一个地址交给你的浏览器,而真正去连接的是你的浏览器。无论哪种情况,Chrono Mock 自己都不会打开任何连接,它对你的应用所测量的任何内容也不会被发送到任何地方。