【问题标题】:How to simulate the passage of time to debug a program?如何模拟时间的流逝来调试程序?
【发布时间】:2018-08-13 12:51:03
【问题描述】:

我正在编写一个 C++ 程序,该程序在运行时跟踪日期,并进行记录。我想测试和调试这个记录保存功能,但记录本身可以跨越数年;让时间自然流逝以暴露错误将需要……一段时间。

是否有既定的模拟时间流逝的方法,让我更容易调试这个程序?我正在使用 C 的 ctime 库来获取日期。

【问题讨论】:

  • 我会做一个依赖注入来获取当前时间。这样你就可以注入你自己的 impl 来“快速前进”(例如,在未来的某个时候提供一个固定的答案)

标签: c++ visual-studio date debugging ctime


【解决方案1】:

如果您希望您的系统可测试,您将希望能够替换整个时间引擎。

有多种方法可以替换时间引擎。

最简单的方法是创建一个新的时间引擎单例来复制您正在使用的时间引擎 API(在您的情况下,ctime)。

然后清除对基于ctime的 API 的所有使用,并将它们重定向到您的新时间引擎。

这个新的时间引擎可以配置为使用ctime,或其他东西。

为了更可靠,您甚至需要更改与旧 API 交互的任何数据结构的二进制布局和类型,审核您将内容转换为/从 void 指针或重新解释转换它们的每个情况等.


另一种方法是依赖注入,您可以将时间引擎作为参数传递给程序,而不是使用单例。程序中需要访问时间的每个部分现在要么存储指向时间引擎的指针,要么将其作为函数参数。


现在您可以控制时间,您可以安排它更快地通过、四处跳跃等。根据您的系统,您可能希望在时间流逝方面或多或少更真实,它可能会暴露不同的真实和不真实真正的错误。

即使你做了所有这些,你也不能确定你的程序没有时间错误。您可能会以意想不到的方式与操作系统时间交互。但你至少可以解决其中一些问题。

【讨论】:

  • 我只在一个位置使用 time(),所以将它包装在一个可以转换它的函数中绝对是最简单的方法,谢谢!
  • @AnneQuinn 从理论上讲,您还需要处理从文件戳中读取时间和任何其他与时间相关的操作,以防您需要扩展谎言。
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多