【问题标题】:How to slow all time measurements of a process?如何减慢过程的所有时间测量?
【发布时间】:2014-08-16 20:28:11
【问题描述】:

我想让应用程序相信时间比实时快/慢。 IE。当t0+dt 是实时的时,我需要让所有时间测量API 返回t0+dt*s 和用户定义的s。这将影响gettimeofday()timer_gettime() 之类的任何内容以及所有相关功能和机制(包括计时器的实际触发时间)。

我想在某个地方放置一个钩子,这会改变应用的可见时间。

在Linux系统中,放置这样一个钩子的最佳位置是什么,这样我就不必创建太多的钩子了?这有什么中心位置吗?

【问题讨论】:

    标签: linux time hook


    【解决方案1】:

    您可以使用this question 中描述的 LD_PRELOAD 技巧。
    Libfaketime 接缝完全满足您的需求(请参阅“高级时间规范选项”下的自述文件)。以下示例显示“睡眠”的时间变慢了 2 倍:

    $ time FAKETIME="x0.5" LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 sleep 1
    real    0m2.002s
    user    0m0.000s
    sys 0m0.000s
    

    (在 debian 系统上,因此是 /usr/lib/)

    如果它实际上并没有做你想做的事,我建议不要推出你自己的解决方案,而是从那里获取它的源代码并实现你需要的东西。

    为了完整起见,另一个可能的起点是datefudge

    【讨论】:

    • 这些似乎只是改变时间,而不是改变它的规模。也就是说,它们不会影响任何计时器。无论如何,感谢您在这个方向上的第一个指示。
    • @Ruslan:也许我不明白你所说的“改变比例”是什么意思,但这似乎工作正常:'time FAKETIME="x0.5" LD_PRELOAD=/usr/lib/x86_64 -linux-gnu/faketime/libfaketime.so.1 sleep 1' 需要 2 秒而不是 1 秒(更改答案以指向此示例)
    • 啊,确实,在文档中错过了这个。奇怪的是,尽管计时器确实改变了速度,localtime 仍然得到实时。无论如何,我认为这是一个足够好的答案,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2014-02-14
    相关资源
    最近更新 更多